在PHP表单中,一个简单的图像上传到目录不工作?

时间:2012-10-12 07:44:51

标签: php image forms upload

表单的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 个答案:

答案 0 :(得分: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的形式,这将要求您编写代码以接受该文件,然后将其移动到本地系统上的某个位置...这正是无论如何你要做什么

答案 1 :(得分:2)

您正在尝试使用无效的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"]))

答案 2 :(得分:2)

第一个问题是您将网址传递给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
}

答案 3 :(得分:1)

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

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