2009-07-24 98 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}.";        
     }     

    }    
    } 
?>