我想写一个PHP上传器,它将文件保存到我的FTP上。
我找到了这个脚本:
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& 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("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
我在max filesize值中添加了0,因为我想用160kb图像进行测试。
一切正常。它甚至说:
Upload: bier15291.jpg
Type: image/jpeg
Size: 158.26171875 kB
Temp file: /mnt/shared/tmp/php_0aOep
Stored in: upload/bier15291.jpg
但我无法在FTP上找到该文件。
我做错了什么?
答案 0 :(得分:1)
请检查move_uploaded_file的返回值。如果文件名不是有效的上传文件或移动文件内容出错,move_uploaded_file将返回false。
答案 1 :(得分:0)
看看这个:
http://www.php.net/manual/en/features.file-upload.errors.php
在尝试移动文件时,您需要进行一些错误处理,因为目前只有在实际尝试移动文件之前才检查IF $_FILES["file"]["error"] > 0
。
因此,您的代码只会在移动之前确认临时文件中没有错误。
考虑来自http://www.php.net/manual/en/function.move-uploaded-file.php
的这些陈述如果filename不是有效的上传文件,则不会执行任何操作,并且 move_uploaded_file()将返回FALSE。
如果filename是有效的上传文件,但某些文件无法移动 原因,不会发生任何操作,move_uploaded_file()将返回 假。此外,还会发出警告。
所以你在使用它之前正确检查临时文件是否正确且没有错误,但你还需要从move_upload_file()
函数中捕获错误以确保移动为TRUE或FALSE。
执行类似操作(我刚修改了代码以在move_uploaded_file()
周围添加IF)
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
if (move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]))
{
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
else
{
//output the errors here (ie using $_FILES["file"]["error"])
}
}
然后错误数组应输出出错的地方。即(可能)UPLOAD_ERR_CANT_WRITE。这将指出你的问题,并且最好还是在你的代码中,所以你的脚本优雅地失败而不是没有任何事情发生(应该永远不会有任何事情发生!)
答案 2 :(得分:0)
所以解决方案是设置权限0775 ...