【问题标题】:In php form, a simple image upload to directory not working?在 php 表单中,简单的图片上传到目录不起作用?
【发布时间】:2012-10-02 23:55:33
【问题描述】:

表单的php文件是:

<?php
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 60000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("http://example.me/imgs/examples" . $_FILES["file"]["name"]))
  {
  echo $_FILES["file"]["name"] . " already exists. ";
  }
else
  {
  move_uploaded_file($_FILES["file"]["tmp_name"],
  "http://example.me/imgs/examples" . $_FILES["file"]["name"]);
  echo "Stored in: " . "http://example.me/imgs/examples" . $_FILES["file"]["name"];
  }
  }
  }
  else
  {
  echo "Invalid file";
  }
  ?>

这很简单,对吧?表单的html是:

 <form action="img_upload.php" method="post" enctype="multipart/form-data">
 <label for="file">Filename:</label>
 <input type="file" name="file" id="file" /> 
 <input type="submit" name="submit" value="Submit"/>
 </form>

也足够简单;正确的?提交图像后,我被重定向到 img_upload.php 文件,并显示以下文本:

 Upload: example.jpg
 Type: image/jpeg
 Size: 39.1943359375 Kb
 Temp file: C:\WINDOWS\Temp\php66.tmp
 Stored in: http://example.me/imgs/examplesexample.jpg

当我尝试执行这样的简单任务并且没有错误但也没有结果时,我感到非常沮丧。我已经尝试在 php 脚本中添加像 imgs/examples/ 这样的“/”,唯一的区别是提交后的以下行是:

 Stored in: http://example.me/imgs/examples/example.jpg

关于我在这里缺少什么的任何想法。我有许多其他 php 脚本/mysql 表正在使用和上传图像,但对于这个简单的任务什么都没有。我在 localhost 上的 apache 服务器上使用 php 5 进行测试。提前感谢大家的任何帮助。

【问题讨论】:

  • 我认为您的服务器中没有上传权限。使用网站管理面板进行检查。
  • 您是否拥有上传图片所需的文件夹,您是否有权写入该目录?
  • 我没有管理面板。我直接在 apache 的配置文件、虚拟主机配置文件或 php 的 ini 文件中进行所有更改。
  • @Alex 是的,我有权限,正如我所说,我在其他脚本中拥有通过 php/mysql 创建的小型 cms,其中图像存储在目录中并且可以正常工作。我想要上传图像的文件夹也确实存在。这就是我感到沮丧的原因。

标签: php image forms upload


【解决方案1】:

您不太可能将文件移动到http://example.me/imgs/examples/。这不是您本地系统上的路径。

您需要将其移至 C:/path/to/web/root/filename.jpg 之类的路径。

这与 http 协议可能工作的其他地方不同,因为您是写入一个文件,而不是读取一个文件。

您的 PHP 脚本无法真正知道您的 http://example.me/imgs/examples/ 目录与它自己在同一台服务器上;它无法弄清楚那个 URL 实际上是指c:/apache/htdocs/imgs/examples/。 (想象一下,如果您将 Apache 设置为将上述目录映射到完全不同的位置,或者您的文件系统设置为实际将该目录链接到其他位置!PHP 无法弄清楚,它太复杂了。)虽然它可能是在某些情况下可能会写入 HTTP 协议 URL,但不清楚这意味着什么,编写 PHP 的人也没有实现这一点。如果它是编写的,它可能会采取将文件作为 POST 上传到该 URL 的形式,这将要求您编写代码来接受该文件,然后将其移动到本地系统上的某个位置......这正是 无论如何你都想做什么

【讨论】:

  • 最好使用相对路径名,或者至少是可配置的,因此它不会有硬编码的绝对路径
  • 它确实像这样工作,但是有没有办法像其他所有事情一样使用 http 请求来完成这项工作。就像更改我的 php ini 文件、apache 配置文件或某种 Windows 文件中的某些内容一样。无论如何,感谢您的帮助。
  • 没有。您不能使用 move_uploaded_file() 将文件保存到 HTTP URL。我认为我在上面的回答中很好地解释了原因。
  • 正如我所说,它正在使用系统的本地路径工作。当我上线时,我能否将其更改为 serverroot 或 documentroot 路径的相对 url?
  • 直到我询问是否有什么我可以做的事情之后,你给出的解释才出现。感谢您花时间解释这一点,因为它有助于我有更多的理解。非常感谢埃文。
【解决方案2】:

您必须使用目录位置系统进行上传。 第一类;不要使用 http:// ! 次要的:它可以位于某个目录,例如; 我们要上传 uploads/ 目录在我们的 .php 文件路径上

move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/" . $_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"],"../uploads/" . $_FILES["file"]["name"]);

【讨论】:

  • http 请求适用于我的设置,适用于其他一切。从一个站点链接到另一个站点,将图像从一个站点链接到另一个站点,将样式表从一个站点链接到另一个站点,javascripts 等等。那么为什么这会有所不同。正如我在 Windows 主机文件和我的 apache 配置文件之前所说的那样设置为这样工作。为什么会有所不同?
  • 这是不同的,因为在其他地方你是一个http路径读取,而在这种情况下你是写入一个http路径. PHP 不知道该怎么做。只需使用文件路径尝试一下,看看它是否有效。
  • 我只是在查看其他一切如何与 http 请求一起工作时遇到问题,但只有这个我必须使用 Windows 系统路径。如果有人可以解释这一点,这将对我的学习有所帮助。我将尝试 Windows 本地路径,但对于这种情况,我仍然觉得很奇怪。我很想知道为什么?
  • PHP 只是不知道如何写入 http 地址。我将在上面的回答中对此进行扩展,请稍等。
  • @Tony 你不能使用 ".","..","..." 吗?他们可以在您的主机上找到您的目录!
【解决方案3】:

第一个问题是您将 URL 传递给 move_uploaded_file()。那需要是本地文件系统路径。 file_exists() 也一样,不能带 URL。示例:

// if img directory is on the same level as the PHP script...
move_uploaded_file($_FILES["file"]["tmp_name"], "imgs/examples/" . $_FILES["file"]["name"]);

第二个问题是你不检查返回值,你只是假设移动有效。 move_uploaded_file() 成功时返回布尔值 true,失败时返回 false

试试:

if(move_uploaded_file($_FILES["file"]["tmp_name"], "imgs/examples/" . $_FILES["file"]["name"]))
{
    // worked
}
else
{
    // didn't work
}

【讨论】:

  • 该目录与 php 脚本不在同一级别,我也尝试使用相对 url。我使用 http 的原因也是因为它是在我的虚拟主机配置文件中为这个站点设置的。我可以使用这样的 url 从一个虚拟主机站点链接到另一个站点,所以我不明白这是怎么回事。我也在我的 Windows 主机文件中设置了它。
  • 我计划将此作为下一步,但我认为上传图片是主要的。然后我会根据最终设置设置 if else 语句。
  • @Tony,没有办法做到这一点,不幸的是,没有多少虚拟主机或 Windows 主机配置可以做到这一点。如果您需要共享图像,那么如果您将路径传递到目标站点,则类似于中心位置或仅将它们存储在其中一个站点上将起作用,例如/home/sites/site-A/images/.
  • 谢谢我现在有了更好的理解。我非常感谢您的宝贵时间以及其他提供帮助的人。
【解决方案4】:

您正在尝试使用 HTTP 路径 (http://example.me/imgs/examples) 移动您上传的文件,但这是行不通的。

指定服务器路径,如/imgs/examples/ [使用正确的路径,我只是假设]

move_uploaded_file($_FILES["file"]["tmp_name"],
  "/imgs/examples/" . $_FILES["file"]["name"]);

另外,您可能需要将下一行从 HTTP 路径更改为服务器路径,

if (file_exists("http://example.me/imgs/examples" . $_FILES["file"]["name"]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多