2012-01-06 200 views
1

我目前上傳單個文件成功地與以下形式:PHP上傳:上傳多個文件?

<html> 
<body> 

<form action="upload_file.php" method="post" enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file" /> 

<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 

</body> 
</html> 

並與下面的腳本:

<?php 
error_reporting(E_ALL); 



    if (($_FILES["file"]["size"] < 20000)) 
     { 
     if ($_FILES["file"]["error"] > 0) 
     { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
     } 
     else 
     { 
     echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
     echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
     echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 


     $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"]); 

     if ($moved) { 
      echo "Move: Success <br/>"; 
     } 
     else { 
      echo "Move Failed <br/>"; 
     } 


      echo "Stored in: " . "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"]; 
      } 
     } 

    else 
     { 
     echo "Invalid file"; 
     } 
    ?> 

現在我想允許用戶選擇三個不同的文件從形式。我發現了一些指南,說明如何做類似的事情,但我無法完成它的工作。

我已經修改了形式如下(包括三個輸入):

<html> 
<body> 

<form action="upload_file.php" method="post" enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file" /> 
<input type="file" name="file" id="file" /> 
<input type="file" name="file" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 

</body> 
</html> 

但我不知道如何修改PHP來處理所有的三個文件。我知道我需要遍歷_FILES,但是我嘗試過的所有東西都不起作用。任何指針將不勝感激。

+2

http://php.net/manual/en/features.file-upload.multiple.php – mario 2012-01-06 16:33:41

回答

7

每個文件元素都必須有一個唯一的名稱,或使用PHP的數組簡寫:

<input type="file" name="file1" /> 
<input type="file" name="file2" /> 

<input type="file" name="file[]" /> 
<input type="file" name="file[]" /> 

記住 - 在name屬性定義你將如何識別服務器上的那場,並且如果您多次使用相同的名稱,則PHP將在覆蓋提交的數據時用最新的副本覆蓋先前的副本。數組表示法([])告訴PHP,您意圖擁有多個具有相同名稱的字段,並且它找到的每個副本都應添加到數組中,而不會被覆蓋。

對於獨特的名稱版本,您可以像處理單個文件一樣處理每個版本。

對於陣列版本,PHP具有設計愚蠢,需要稍微不同的處理。你結束了一個$ _FILES數組,看起來像

$_FILES = array(
    'fieldname' => array(
     'name' => array(
      0 => 'first file', 
      1 => 'second file', 
      etc... 
     ) 
    ) 
) 
+0

完美!那正是我需要的。我很感激 :)。 – SB2055 2012-01-06 16:45:37

4

您需要更改

<input name="file" /> 

<input name="file[]" /> 

爲了讓他們到一個數組。

然後在你的腳本,你引用它們爲:

$_FILES['file']['name'][0]; // first file 
$_FILES['file']['name'][1]; // second file 

注意,你可以用任何你通常會在一個單一的文件中使用其他文件屬性的替代名稱(如大小,類型等)。


或者,你可以給他們所有不同的名字:

<input name="firstfile" /> 
<input name="secondfile" /> 

然後在你的腳本:

$_FILES['firstfile']; // first file 
$_FILES['secondfile']; // second file 
+1

PHP文件中的數據去到$ _FILES中,而不是$ _POST。參考上傳的文件對於陣列版本而言(結構上)與單名文件大不相同。它會是$ _FILES ['file'] ['name'] [0] – 2012-01-06 16:34:24

+0

已更新爲'$ _FILES' – 2012-01-06 16:36:20

+0

儘管如此,仍然是錯誤的結構。對於每個字段名稱,每個字段名稱都可以,但對陣列版本而言不會。 – 2012-01-06 16:43:23

0

您需要更改HTML側name屬性的值到file[],然後在PHP中通過迭代$_FILES['files']並像平常一樣使用單個文件處理每個元素。

+0

非常感謝凱末爾! – SB2055 2012-01-06 16:45:59

1

您可以選擇像這樣的單一輸入多個文件..

<input type="file" name="pic[]" id="pic" accept="image/*" multiple="multiple"/> 

這個輸入框可以通過按下控制鍵接受多個文件。現在你可以用一些解釋訪問它們在PHP這樣

$_FILES['file']['name'][0]; // first file 
$_FILES['file']['name'][1]; // second file 
0

KISS代碼:

有以下功能齊全簡單的代碼,讓您開始。在您完成簡單的工作後,您可以添加錯誤檢查,最大大小等等。

$ _FILES數組是PHP內置的3維數組,它是存儲所有上傳文件信息的地方。

HTML INPUT標記的每個'name ='部分只有一個元素。

所以,如果您的INPUT標記看起來是這樣的:

<INPUT name="InpFile[]" type="file" /> 

的$ _FILES數組將有一個名爲 'InpFile' 一種數組元素。

還要注意InpFile .....之後的[],告訴PHP,每次使用具有相同'名稱'的輸入標籤時,它都會將它添加到同一個$ _FILES數組頂部元素中。

在一個元素中,有5個其他數組元素,名稱分別爲'name','type','tmp_name','error'和'size'。

這些數組元素中的每一個都包含每個上傳文件的數據。

你的第一個上傳的文件名會在$ _FILES [「InpFile」] [「名稱」] [0]

而關於你的第一個上傳文件中的其他信息也將陣列相同的例如,第一個文件的大小將在$ _FILES ['InpFile'] ['size'] ['0']

每個後續文件名將在$ _FILES ['InpFile'] [''名稱'] [1],$ _FILES ['InpFile'] ['名稱'] [2] ....等

上傳後,每個文件在$ _FILES ['InpFile '] ['tmp_name'] [0 ... n]元素,這是它首先使用的名稱將文件上傳到臨時區域。

因此,上傳後,您必須將文件從臨時區域移動到您想要的位置。

與此語句來完成:

move_uploaded_file($_FILES['InpFile']['tmp_name'][$Key], 
    $_FILES['InpFile']['name'][$Key]) 
     or die("Move from Temp area failed"); 

在下面的foreach語句,$鍵和$名稱只存在使得$ key將爲分配越來越多的每次迭代...即。 0,1,2 .....等,然後您可以使用$ Key來引用數組中每個文件的名稱,tmp_name等。

此代碼可讓您在一頁上完成所有操作,因爲表單實際調用自身(action =「」)以發佈。因此,第一次加載頁面時,您將在php代碼中出現錯誤,因爲$ _FILES尚未設置......所以所有的代碼都在If語句中:If($ _FILES)。

提交表單後,它會執行該操作,然後在每個文件移動到您的區域後回顯其狀態。

此外,這段代碼會將文件上傳到頁面所在的同一目錄中...您可以使用SO上的其他帖子更改所有信息。

<FORM action="" method="post" enctype="multipart/form-data"> 
    <P align="center"><B>Choose Files</B><BR> 
     <BR> 
     File One: 
     <INPUT name="InpFile[]" type="file" /> 
     <BR> 
     <BR> 
     File Two: 
     <INPUT name="InpFile[]" type="file" /> 
     <BR> 
    </P> 
    <P align="center"><BR> 
     <INPUT type="submit" name="submit" value="UpLoad"> 
    </P> 
</FORM> 
    <H3 align="center">&nbsp;</H3> 
    <H3 align="center">Status:</H3> 
    <P align="center">&nbsp;</P> 
    <P align="center"> 

把這個PHP代碼在這裏在同一頁上:

<?php 
If ($_FILES) { 
    foreach ($_FILES ['InpFile']['name'] as $Key => $Name) { 
     move_uploaded_file(
      $_FILES['InpFile']['tmp_name'][$Key], 
      $_FILES['InpFile']['name'][$Key] 
     ) or die("Move from Temp area Failed"); 
     $EFileName = $_FILES['InpFile']['name'][$Key]; 
     echo "<P>$EFileName: Uploaded"; 
    } 
} 
?>