簡體   English   中英

PHP 上傳腳本在新主機上無法正常運行

[英]PHP Upload Script not Functioning Properly with New Host

我設置了一個 php 腳本,它創建一個目錄並將文件上傳到該目錄。 我的問題是,當我使用腳本創建目錄時,文件不會完全上傳。 我在不同的主機上運行了完全相同的腳本,上傳過程運行良好。 另外,如果我手動創建上傳目錄並通過 ftp 應用 chmod 777 則傳輸工作正常。 是否需要更改托管服務提供商的某種設置以允許 function 正常工作?

這是上傳表格:

<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.";
  }
?> 

此外,當我運行腳本時,不會產生錯誤,並且文件會回顯“圖像文件已成功傳輸”。 但是當我在新位置檢查文件時,它是完全無效的。 感謝您在這個問題上的時間。

首先,您的腳本存在安全漏洞。 永遠不要使用傳遞的 $_POST 數據來創建系統目錄。 永遠不要將 0777 用於任何事情。

move_uploaded_file() 在失敗時返回 false ,即使失敗(在您的代碼中)您仍然會收到成功消息

打開 display_errors 和錯誤日志,然后重試。

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

之后,您將得到主要問題。 還可以在move_uploaded_file()之前使用print_r($_FILES)的調試點。

這可能不是您問題的答案,但我希望仍然值得您關注。 不要依賴通過$_FILES發送的文件的類型,據我所知,這只是瀏覽器發送的 mime 類型,很容易被破壞。 使用getimagesize() function 獲取真實的圖像類型以及高度/寬度。

源文件名也是如此,但這不應構成安全漏洞。

看起來您的問題已經包含答案(當您通過 FTP 創建目錄時上傳有效)。

我猜新服務器啟用了安全模式,所以它會在文件操作中檢查文件所有者的 UID。

怎么了:

  1. 您的腳本創建一個目錄,所有者將是網絡服務器
  2. 您的腳本(腳本的所有者通常是 ftp 用戶)嘗試對目錄進行 chmod

腳本(所有者:ftp)無法 chmod 目錄(所有者:webserver),因為 UID 不同。

解決方案:使用ftp_mkdir()創建目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM