我已经设置了一个php脚本,它创建一个目录并将文件上传到该目录。我的问题是,当我使用脚本创建目录时,文件将不会完全上传。我在不同的主机上运行完全相同的脚本,上传过程工作正常。另外,如果我手动创建上传目录并通过ftp应用chmod 777,那么传输工作正常。是否有某种类型的托管服务提供商的设置需要改变,以使该功能正常工作?
以下是上传表单:
<form action="/uploadFile.php" method="post"
enctype="multipart/form-data">
<label for="img_preview">Preview Image:</label>
<input type="file" name="img_preview" id="img_preview" />
<br />
<input type="hidden" name="id" value="newDirectory" />
<input type="submit" name="submit" value="Upload Flyer" />
</form>
这是我的PHP脚本(uploadFile.php):
$thisdir = getcwd();
$new_dir = $_POST['id'];
$full_dir = $thisdir . "/upload/" . $new_dir;
function chk_dir($full_dir) {
if(is_dir($full_dir)) {
echo 'welcome back';
} else {
return mkdir($full_dir);
}
}
chk_dir($full_dir);
chmod($full_dir, 0777);
?>
<?php
//upload image
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["img_preview"]["error"] . "<br />";
}
else
{
}
//set image restrictions
?>
<?php
if ((($_FILES["img_preview"]["type"] == "image/gif")
|| ($_FILES["img_preview"]["type"] == "image/jpeg")
|| ($_FILES["img_preview"]["type"] == "image/pjpeg"))
&& ($_FILES["img_preview"]["size"] < 80000))
{
if ($_FILES["img_preview"]["error"] > 0)
{
echo "Please only upload an image for previewing (jpg or gif)...<br>
Also, check to make sure the filesize is less than 8MB" . $_FILES["img_preview"]["error"] . "<br />";
}
else
{
//check the image into new directory
if (file_exists("upload/". $new_dir ."/". $_FILES["img_preview"]["name"]))
{
echo "It seems that " . $_FILES["img_preview"]["name"] . " already exists.";
}
else
{
move_uploaded_file($_FILES["img_preview"]["tmp_name"],
"upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"]);
echo "image file has transferred successfully!";
}
}
}
else
{
echo "Invalid file please contact for assistance.";
}
?>
此外,当我运行脚本时,不会产生任何错误,并且文件echos“图像文件已成功传输!”但是当我在新位置检查文件时,它完全无效。感谢您在本期中的时间。
答案 0 :(得分:1)
首先,您的脚本有一个安全漏洞。永远不要使用传递的$ _POST数据来创建系统目录。永远不要使用0777。
move_uploaded_file()在失败时返回false,即使失败(在您的代码中),您仍然会收到成功消息
启用display_errors和错误记录,然后重试。
答案 1 :(得分:0)
您已独立使用move_uploaded_file()
。如果返回false,则还将打印sucsess
消息。
尝试
if ( move_uploaded_file($_FILES["img_preview"]["tmp_name"],
"upload/" . $_POST['id'] . "/" . $_FILES["img_preview"]["name"])) {
echo "sucess";
}else{
echo "fail";
}
之后你将得到主要问题。也可以使用调试点
print_r($_FILES)
之前的move_uploaded_file()
。
答案 2 :(得分:0)
这可能不是你问题的答案,但我希望它值得你注意。不要依赖通过$_FILES
发送的文件类型,这只是浏览器发送的mime类型,据我记得,它很容易被破坏。使用getimagesize()
函数可以获得真实的图像类型以及高度/宽度。
源文件名也是如此,但这不应构成安全漏洞。
答案 3 :(得分:0)
看起来您的问题已包含答案(通过FTP创建目录时上传工作正常)。
我猜新服务器已启用safe_mode,因此它会检查文件操作员的文件所有者的UID。
会发生什么:
脚本(所有者:ftp)无法chmod目录(所有者:webserver),因为UID是不同的。
解决方案:使用ftp_mkdir()创建目录。