2015-06-14 16 views
2

我有以下HTML和PHP代碼來處理上傳多個文件到服務器中的文件夾。 只有一個文件(來自選定的上傳文件)被上傳到服務器。 有人能告訴我我做錯了什麼嗎?我剛剛開始使用PHP/HTML,並且對此任務無能爲力。上傳多個文件到服務器:獲取PHP代碼錯誤

HTML:

<form action="upload_multi15_action.php" method="POST" enctype="multipart/form-data"> 
 
    Select files to upload: <br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <input name="userfile[]" type="file" /><br /> 
 
     <br /> 
 
     <input type="submit" value="Upload files"> 
 

 

 
</form>

PHP:

$count=0; 
 

 
    echo '<pre>'; 
 
    foreach($_FILES['userfile']['name'] as $to_upload){  
 
     $upload = "./".basename($to_upload); 
 
     move_uploaded_file($_FILES['userfile']['tmp_name'][$count], $upload) or  
 
      die("Possible file upload attack!\n"); 
 
     $count = $count++; 
 
     $upload = ''; 
 
    } 
 
    print "</pre>";

我完全失去了什麼,我可以做錯誤的PHP代碼。

回答

0
$count = $count++; 

,因爲它是在這裏寫$關鍵,我希望這將始終爲0的職位增量運算符返回值,然後遞增它。但是,您將該返回值分配回相同的變量。因此,下次嘗試移動上傳的文件時,它不再存在,因爲您已經移動了第一個文件。

無論如何你並不需要保留一個計數器,你可以通過foreach給你索引,就像我在這裏所做的那樣。

<?php 
echo '<pre>'; 
foreach($_FILES['userfile']['name'] as $count => $to_upload){ 
    if($_FILES['userfile']['error'][$count] != 0) { 
     echo "Error {$_FILES['userfile']['error'][$count]} on $count<br>"; 
     continue; 
    } 
    $upload = "./".basename($to_upload); 
    move_uploaded_file($_FILES['userfile']['tmp_name'][$count], $upload) or  
     die("Possible file upload attack!\n"); 
    $upload = ''; 
} 
print "</pre>"; 

作爲一個附註,您應該檢查傳入的名稱。例如:由於它被寫入,有人可以通過上傳同名的PHP文件來替換自己的上傳文件。 [編輯]如果您希望文件是特定類型的文件,通常也會檢查傳入的數據。例如,如果您需要圖像文件,請確保文件可由getimagesize分析。


另外,如果你不想從foreach使用索引,並希望保持您的基於增量法,只是改變$count = $count++;$count++;這消除了增量後的返回值的分配回$count變量,這導致$count永不改變。

+0

我注意到了你的建議。我有很多需要學習的東西似乎是 –

+0

每個人都從某個地方開始。一個好的經驗法則是:永遠不要相信用戶並驗證他們給你的所有東西。從技術上講,我可能不應該像'我在那裏'那樣'回顯'$ count'變量,因爲用戶可以編輯表單並修改表單,儘管我很難考慮一個可以利用它的有用攻擊。順便說一句,如果你不想使用foreach的索引,並希望保持基於增量的方法,只需將'$ count = $ count ++;'更改爲'$ count ++;' – EPB

+0

update @EPB,我更改了「$ count = $ count ++「到」$ count ++「。這似乎將所有選定的文件上傳到服務器。我很高興但很驚訝,這個小小的變化讓PHP代碼能夠正常工作。非常感謝您的建議。 –

1

改變這種foreach($_FILES['userfile']['name'] as $to_upload){

foreach($_FILES['userfile']['name'] as $key => $to_upload){

,然後用這樣

move_uploaded_file($_FILES['userfile']['tmp_name'][$key], $upload) 
+0

感謝您的反饋Feroz。根據@EPB的建議,改變我代碼中的計數器似乎是解決我的問題的方法之一。 –

相關問題