0

表单的 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 进行测试。提前感谢所有人的任何帮助。

4

4 回答 4

3

您不太可能将文件移动到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 的形式,这将要求您编写代码来接受该文件,然后将其移动到本地系统的某个位置……这正是您的.

于 2012-10-12T07:47:48.203 回答
2

您正在尝试使用http://example.me/imgs/examples不起作用的 HTTP 路径 ( ) 移动上传的文件。

指定服务器路径,如/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"]))

于 2012-10-12T07:48:19.697 回答
2

第一个问题是您将 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
}
于 2012-10-12T07:53:07.360 回答
1

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

move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/" . $_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"],"../uploads/" . $_FILES["file"]["name"]);
于 2012-10-12T08:05:52.650 回答