2013-04-23 60 views
0

我想將多個文件上傳到服務器。上傳錯誤 - 文件不可寫

據我所看到的文件是不可寫的。

有什麼事,所以我的代碼可以實際工作和上傳文件。

PHP:

if(isset($_FILES ['uploaded_files'])) 
{ 

    foreach($_FILES['uploaded_files']['name'] as $key=>$value) 
    { 
      if(is_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key]) && $_FILES['uploaded_files']['error'][$key] == 0) 
      { 

       $filename = $_FILES['uploaded_files']['name'][$key]; 

       if (is_writable($filename)) { 
         echo 'The file is writable'; 
        } else { 
         echo 'The file is not writable'; 
        } 
       if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename)) 
       { 
       //code 
       } 
       else 
       { 
         die ('There was a problem uploading the pictures.'); 
       } 
      } 
      else 
      { 
      die ('There is a problem with the uploading system.'); 
      } 
    } 
} 

HTML:

<form enctype="multipart/form-data" action="upload.php" method="POST"> 
     <input type="hidden" id="input_clone_id" name="input_clone_id" value="'.$row['id'].'"/> 
     <input type="hidden" id="input_clone_var" name="input_clone_var" value="V"/> 
      <input type="file" name="uploaded_files[]" id="input_clone" multiple="multiple" /><br /> 
     <input type="submit" style="margin-left:0" value="Upload Files" /> 
</form> 

回答

1

我看到兩個問題。首先是安全問題,二是可能是什麼原因造成您的問題

你有一個安全問題就在這裏

$filename = $_FILES['uploaded_files']['name'][$key]; 
... 
if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename)) 
... 

問題:由於$filename來自於$ _FILES數組,就不能值得信賴。用戶告訴你的網站他們的文件名是什麼,並放在那裏。他們可能會爲您提供一些虛假文件名,這可能會導致您的腳本以有趣的方式失敗。在以任何方式使用之前,您需要清理該文件名。

問題B:通過允許用戶指定文件名,他們可能只需指定一個文件名衝突的覆蓋在「圖像/畫廊」目錄中的其他文件。避免這種情況的方法是使用數據庫,爲上傳的文件生成一個唯一標識符,以該唯一名稱存儲文件,並在數據庫中保存原始文件名和其他信息的記錄。這樣你總是知道原始文件名是什麼,並且你沒有機會嘗試覆蓋該目錄中的文件。

寫作的問題:*

你的 「檢查可寫」 的說法是錯誤。返回的文件名是用戶在提交時使用的文件名。這不會指向文件系統上的任何點......它指向他們的(有時)你不能看到的位置。你需要檢查的是你的「../images/gallery」目錄是可寫的,而不是$filename。如果失敗了,如果您有命令行訪問權限,則需要在images文件夾中執行「chmod -R 777 gallery」,或者如果您使用FTP與您的服務器通信,則可以通過您使用的任何FTP客戶端向世界寫入權限。

所以,你應該有,而不是針對檢查的是:

if (is_writable("../images/gallery")) { 
    echo 'The file is writable'; 
} else { 
    echo 'The file is not writable'; 
} 

這樣做,如果你的腳本回來,說:「該文件是可寫的」,它應該已經能夠複製後將文件放入您的images/gallery文件夾中(切記不要使用用戶給您的文件的名稱)。如果沒有,也許你沒有移動上傳文件的權限。

至於上載文件的位置,我覺得有時候腳本執行結束有時之後便被刪除,但如果沒有,你可以重複的文件'tmp_name',如果你去到該目錄,你會發現它坐在那裏。這只是驗證測試,以確保文件實際上到達您的服務器。只要你有上傳文件的目錄的寫權限(即chmod 777),你應該可以在那裏複製它。

+0

謝謝您的詳細解答!我正在使用我的電腦,因爲我在本地主機上工作..可以告訴我如何檢查文件夾,如果它是可寫的。 – 2013-04-23 22:48:38

+0

Windows還是linux? – 2013-04-23 22:50:17

+0

windows ......... – 2013-04-23 22:51:05

1

您檢查,看看是否您最近上傳的,但尚未保存的文件是可寫的,我不認爲這樣的文件將永遠是可寫的。 如果,或者只是檢查您上傳到的文件夾是否可寫,最好刪除它。

除此之外,我檢查你的代碼和它的作品。

+0

問題是我無法在「上傳」文件夾中看到文件。 – 2013-04-23 22:43:07

+0

回聲您的路徑'../images/gallery',看看它指向的地方。我確實檢查了你的代碼,它對我有效,但是我刪除了'../images/gallery',只留下$ filename – 2013-04-23 22:48:41

+0

路徑是正確的。問題是該文件沒有上傳,它不在圖庫文件夾中 – 2013-04-23 22:50:42