2009-07-24 102 views
121

我有使用<input type="file">進行單個文件上傳的經驗。但是,我一次只能上傳一個以上的文件時遇到問題。如何使用HTTP POST選擇並上傳HTML和PHP的多個文件?

例如,我希望能夠選擇一系列圖像,然後將它們一次全部上傳到服務器。

如果可能的話,使用單個文件輸入控件會很好。

有誰知道如何做到這一點?謝謝!

+2

你的意思是選擇在文件選擇對話框中不止一個文件或使用多個文件輸入? – MitMaro 2009-07-24 01:16:12

+0

嗨,您可以上傳檔案文件(zip,rar,tar,...)嗎? – sourcerebels 2009-08-20 11:51:21

回答

158

這是可能的HTML5。示例(PHP 5.4):

<!doctype html> 
<html> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
     <form method="post" enctype="multipart/form-data"> 
      <input type="file" name="my_file[]" multiple> 
      <input type="submit" value="Upload"> 
     </form> 
     <?php 
      if (isset($_FILES['my_file'])) { 
       $myFile = $_FILES['my_file']; 
       $fileCount = count($myFile["name"]); 

       for ($i = 0; $i < $fileCount; $i++) { 
        ?> 
         <p>File #<?= $i+1 ?>:</p> 
         <p> 
          Name: <?= $myFile["name"][$i] ?><br> 
          Temporary file: <?= $myFile["tmp_name"][$i] ?><br> 
          Type: <?= $myFile["type"][$i] ?><br> 
          Size: <?= $myFile["size"][$i] ?><br> 
          Error: <?= $myFile["error"][$i] ?><br> 
         </p> 
        <?php 
       } 
      } 
     ?> 
    </body> 
</html> 

下面是它看起來像在Chrome在文件對話框中選擇2項後:

chrome multiple file select

而這裏的是什麼樣子點擊「上傳」後按鈕。

submitting multiple files to PHP

這僅僅是一個完全工作的答案草圖。請參閱PHP Manual: Handling file uploads以獲取有關在PHP中正確安全處理文件上傳的更多信息。在Firefox 5

-1

部分答案:梨HTTP_UPLOAD可以是有用 http://pear.php.net/manual/en/package.http.http-upload.examples.php

有多個文件

+1

您可以使用PEAR軟件包,但這項任務相當簡單,除非您需要該軟件包提供的額外功能(國際化錯誤消息,驗證等),否則我會建議使用本機PHP功能。但這只是我的看法。 :) – MitMaro 2009-07-24 01:22:12

+0

我同意你的看法,這就是我寫「部分答案」的原因。但我也盡我所能重新使用代碼,我經常盡我所能地用梨(梨編碼器比我更好): – damko 2009-07-24 12:37:51

4

如果你想選擇當您選擇然後瀏覽你顯示的文件選擇對話框中的多個文件的完整示例大多運氣不好。您將需要使用Java applet或類似的東西(我認爲有一個使用小型Flash文件,如果我找到它,我會更新)。目前單個文件輸入只允許選擇單個文件。

如果您正在討論使用多個文件輸入,那麼與使用多個文件輸入應該沒有多大區別。發佈一些代碼,我會嘗試進一步幫助。


更新: 還有就是使用閃光燈使用一個單一的「瀏覽」按鈕的一種方法。我從來沒有親自使用過這個,但我已經閱讀了相當多的內容。我認爲它是你的最佳鏡頭。

http://swfupload.org/

+1

我添加了鏈接到基於Flash的多上傳器。 – MitMaro 2009-07-24 01:30:05

+0

我已經使用了swfupload fwiw - 有時候會有點痛苦,但這並不是很難。 – Meep3D 2009-07-24 08:05:06

+1

這是可能的... – Michelle 2012-06-23 22:33:07

1

如果使用可以設置名稱=多個輸入字段「文件[]」(或任何其他名稱)。當你上傳它們時($_FILES['file'] = array ({file_array},{file_array]..)

6

完整的解決方案:

<html> 
<head> 
</head> 
<body> 
<form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" > 
    <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> 
</form> 

<?php 
echo "No. files uploaded : ".count($_FILES['infile']['name'])."<br>"; 


$uploadDir = "images/"; 
for ($i = 0; $i < count($_FILES['infile']['name']); $i++) { 

echo "File names : ".$_FILES['infile']['name'][$i]."<br>"; 
$ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1); 

// generate a random new file name to avoid name conflict 
$fPath = md5(rand() * time()) . ".$ext"; 

echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>"; 
$result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath); 

if (strlen($ext) > 0){ 
    echo "Uploaded ". $fPath ." succefully. <br>"; 
} 
} 
echo "Upload complete.<br>"; 
?> 

</body> 
</html> 
88

有你需要做的,以創建一個多文件上傳,其基本相當實際的幾件事情。您不需要使用Java,Ajax,Flash。只需建立一個正常的文件上傳表格,即可:

<form enctype="multipart/form-data" action="post_upload.php" method="POST"> 

然後成功的關鍵;

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

不要忘記那些括號! 在post_upload.php嘗試以下操作:

<?php print_r($_FILES['file']['tmp_name']); ?> 

通知你得到tmp_name的值數據的數組,這將意味着你可以訪問每個文件與第三對括號與文件「數」例如:

$_FILES['file']['tmp_name'][0] 

您可以使用php count()來計算所選文件的數量。 Goodluck widdit!

3

在這樣的第一你應該做的形式:

<form method="post" enctype="multipart/form-data" > 
    <input type="file" name="file[]" multiple id="file"/> 
    <input type="submit" name="ok" /> 
</form> 

這是正確的。現在在你的窗體代碼添加以下代碼或任何頁面上你喜歡的

<?php 
if(isset($_POST['ok'])) 
    foreach ($_FILES['file']['name'] as $filename) { 
    echo $filename.'<br/>'; 
} 
?> 

很容易......完成

0

我創建了用於上傳多個圖像的PHP函數, 該功能可上傳多個圖像在特定的文件夾以及它可以保存記錄到數據庫 在下面的代碼 $ arrayimage是通過形式發送的圖像數組 請注意,它不會允許上傳使用多個,但你需要創建具有相同名稱的不同輸入字段,您可以在按鈕cli上設置文件未輸入的動態添加字段CK。

$ dir是要在其中保存圖像 $領域目錄要在數據庫中存儲

數據庫字段必須在陣列甲 例如 如果您的字段的名稱有數據庫imagestore和字段名稱,比如ID,姓名,地址,然後你需要像

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']); 

發佈數據,然後那場傳遞到功能$領域

$ table是要在其中存儲數據的表的名稱。

function multipleImageUpload($arrayimage,$dir,$fields,$table) 
{ 
    //extracting extension of uploaded file 
    $allowedExts = array("gif", "jpeg", "jpg", "png"); 
    $temp = explode(".", $arrayimage["name"]); 
    $extension = end($temp); 

    //validating image 
    if ((($arrayimage["type"] == "image/gif") 
    || ($arrayimage["type"] == "image/jpeg") 
    || ($arrayimage["type"] == "image/jpg") 
    || ($arrayimage["type"] == "image/pjpeg") 
    || ($arrayimage["type"] == "image/x-png") 
    || ($arrayimage["type"] == "image/png")) 

    //check image size 

    && ($arrayimage["size"] < 20000000) 

    //check iamge extension in above created extension array 
    && in_array($extension, $allowedExts)) 
    { 
     if ($arrayimage["error"] > 0) 
     { 
      echo "Error: " . $arrayimage["error"] . "<br>"; 
     } 
     else 
     { 
      echo "Upload: " . $arrayimage["name"] . "<br>"; 
      echo "Type: " . $arrayimage["type"] . "<br>"; 
      echo "Size: " . ($arrayimage["size"]/1024) . " kB<br>"; 
      echo "Stored in: ".$arrayimage['tmp_name']."<br>"; 

      //check if file is exist in folder of not 
      if (file_exists($dir."/".$arrayimage["name"])) 
      { 
       echo $arrayimage['name'] . " already exists. "; 
      } 
      else 
      { 
       //extracting database fields and value 
       foreach($fields as $key=>$val) 
       { 
        $f[]=$key; 
        $v[]=$val; 
        $fi=implode(",",$f); 
        $value=implode("','",$v); 
       } 
       //dynamic sql for inserting data into any table 
       $sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')"; 
       //echo $sql; 
       $imginsquery=mysql_query($sql); 
       move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']); 
       echo "<br> Stored in: " .$dir ."/ Folder <br>"; 

      } 
     } 
    } 
    //if file not match with extension 
    else 
    { 
     echo "Invalid file"; 
    } 
} 
//function imageUpload ends here 
} 

// imageFunctions類到此爲止

,你可以嘗試用它的擴展名檢查圖像文件被創建此功能,您可以替換代碼爲

文件perticular的擴展名列表中插入多張圖片驗證碼
0

我有這個有點簡單一個

<?php 

    $image1=$_FILES["file"] ["name"][0]; 
    $image2=$_FILES["file"] ["name"][1]; 
    $image3=$_FILES["file"] ["name"][2]; 

    $temp1=$_FILES["file"] ["tmp_name"][0]; 
    $temp2=$_FILES["file"] ["tmp_name"][1]; 
    $temp3=$_FILES["file"] ["tmp_name"][2]; 

    $image4=$_FILES["file_ot"] ["name"][0]; 
    $image5=$_FILES["file_ot"] ["name"][1]; 


    $temp4=$_FILES["file_ot"] ["tmp_name"][0]; 
    $temp5=$_FILES["file_ot"] ["tmp_name"][1]; 




    $query="INSERT INTO `vendordata`(`details`, `phone`, `email`, `driverpic`, `licensepic`, `adharcardpic`, `pancard`, `policeverification`) 
    VALUES ('$details','$phone','$email','$image1','$image2','$image3','$image4','$image5')"; 



    move_uploaded_file($temp1,'uploads/'.$image1); 
    move_uploaded_file($temp2,'uploads/'.$image2); 
    move_uploaded_file($temp3,'uploads/'.$image3); 
    move_uploaded_file($temp4,'uploads/'.$image4); 
    move_uploaded_file($temp5,'uploads/'.$image5); 
    $run=$db->query($query); 
    if ($run) { 
     echo "inserted"; 
    } 
    else { 
     echo("Error description: " . mysqli_error($db)); 
    } 
    ?> 
0
<form action="" method="POST" enctype="multipart/form-data"> 
    Select image to upload: 
    <input type="file" name="file[]" multiple/> 
    <input type="submit" name="submit" value="Upload Image" /> 
</form> 

使用FOR循環

<?php  
    $file_dir = "uploads";  
    if (isset($_POST["submit"])) { 

    for ($x = 0; $x < count($_FILES['file']['name']); $x++) {    

     $file_name = $_FILES['file']['name'][$x]; 
     $file_tmp = $_FILES['file']['tmp_name'][$x]; 

     /* location file save */ 
     $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR =/or \ */ 

     if (move_uploaded_file($file_tmp, $file_target)) {       
     echo "{$file_name} has been uploaded. <br />";      
     } else {      
     echo "Sorry, there was an error uploading {$file_name}.";        
     }     

    }    
    }  
?> 

使用foreach循環

<?php 
    $file_dir = "uploads";  
    if (isset($_POST["submit"])) { 

    foreach ($_FILES['file']['name'] as $key => $value) {     

     $file_name = $_FILES['file']['name'][$key]; 
     $file_tmp = $_FILES['file']['tmp_name'][$key]; 

     /* location file save */ 
     $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR =/or \ */ 

     if (move_uploaded_file($file_tmp, $file_target)) {       
     echo "{$file_name} has been uploaded. <br />";      
     } else {      
     echo "Sorry, there was an error uploading {$file_name}.";        
     }     

    }    
    } 
?>