PHP上传脚本无法在新主机上正常运行


PHP Upload Script not Functioning Properly with New Host

我已经设置了一个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"图像文件已成功传输!"但当我在新位置检查文件时,它完全无效。感谢您在本期中抽出时间。

首先,您的脚本有一个安全漏洞。永远不要使用传递的$_POST数据来创建系统目录。永远不要用0777做任何事情。

move_uploaded_file((在失败时返回false,即使失败(在代码中(,您仍然会收到成功消息

打开display_errors和错误日志记录,然后重试。

看起来你的问题已经包含了答案(当你通过FTP创建目录时,上传就可以了(。

我猜新服务器启用了safe_mode,所以它将在文件操作中检查文件所有者的UID。

发生了什么:

  1. 您的脚本创建了一个目录,所有者将是Web服务器
  2. 您的脚本(脚本的所有者通常是ftp用户(尝试chmod目录

脚本(所有者:ftp(无法chmod目录(所有者:webserver(,因为UID不同。

解决方案:使用ftp_mkdir((创建目录。

您已经独立使用了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";
}

在那之后,你会发现主要的问题是什么。还通过使用调试点CCD_ 3先于CCD_。

这可能不是你问题的答案,但我希望它仍然值得你关注。不要依赖于通过$_FILES发送的文件类型,据我所知,这只是浏览器发送的mime类型,它可以很容易地被折衷。使用getimagesize()函数可以获得真实的图像类型以及高度/宽度。

源文件名也是如此,但这不应该造成安全漏洞。