如何使用 HTTP POST 使用 HTML 和 PHP 选择和上传多个文件?

Posted

技术标签:

【中文标题】如何使用 HTTP POST 使用 HTML 和 PHP 选择和上传多个文件?【英文标题】:How can I select and upload multiple files with HTML and PHP, using HTTP POST? 【发布时间】:2021-11-04 01:12:46 【问题描述】:

我有使用<input type="file"> 上传单个文件的经验。但是,我无法一次上传多个文件。

例如,我想选择一系列图像,然后一次性将它们上传到服务器。

如果可能,最好使用单个文件输入控件。

有谁知道如何做到这一点?

【问题讨论】:

您的意思是在文件选择器对话框中选择多个文件还是使用多个文件输入? 您好,您可以上传存档文件(zip、rar、tar...)吗? 【参考方案1】:

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

有多个文件的完整示例

【讨论】:

您可以使用 PEAR 包,但这项任务相当简单,除非您需要该包提供的额外功能(国际化错误消息、验证等),否则我建议您使用原生 PHP职能。但这只是我的意见。 :) 我同意你的观点,这就是我写“部分答案”的原因。但我也尽我所能重复使用代码,我经常尽可能多地使用 pear(pear 编码器比我好得多:-D)【参考方案2】:

如果您想从选择浏览时显示的文件选择器对话框中选择多个文件,那么您很不走运。您将需要使用 Java 小程序或类似的东西(我认为有一个使用小闪存文件,如果我找到它会更新)。目前单个文件输入只允许选择单个文件。

如果您正在谈论使用多个文件输入,那么与使用一个应该没有太大区别。发布一些代码,我会尽力提供进一步的帮助。


更新: 有一种方法可以使用使用 Flash 的单个“浏览”按钮。我从未亲自使用过它,但我已经阅读了相当多的内容。我认为这是你最好的选择。

http://swfupload.org/

【讨论】:

我将链接添加到基于 Flash 的多个上传器。 我使用过 swfupload fwiw - 有时会有点痛苦,但实际上并不难工作。 @Barsoom 是正确的。在过去的几年里,多个文件上传的情况变得更好了。 :D【参考方案3】:

如果您使用多个输入字段,您可以设置 name="file[]"(或任何其他名称)。当您上传它们时,这会将它们放入一个数组中 ($_FILES['file'] = array (file_array,file_array]..))

【讨论】:

【参考方案4】:

这在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>

这是在文件对话框中选择 2 个项目后在 Chrome 中的外观:

这是点击“上传”按钮后的样子。

这只是一个完整工作答案的草图。有关在 PHP 中正确、安全地处理文件上传的更多信息,请参阅 PHP Manual: Handling file uploads。

【讨论】:

是否通过了w3c验证,还是应该是multiple="multiple" 我相信它是有效的:thoughtresults.com/html5-boolean-attributes。如果您添加 .,它将通过 w3c 验证器 是的,它可能会验证 HTML,但无法通过 XHTML。尽管我仍然喜欢使用 XHTML,但我认为现在人们建议不要使用它。 如果不添加属性 name(例如 name="file[]" ),它将无法工作。我尝试edit the answer,但被拒绝了。 谢谢@MichelAyres,我已经更新了我的答案。当我最初写这篇文章时,我只解决了问题的 HTML 部分 b/c 还有其他解释 PHP 部分的答案。随着时间的推移,这成为了一个流行的答案,所以我现在已经扩展到涵盖 HTML 和 PHP。【参考方案5】:

Firefox 5 中的完整解决方案:

<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>

【讨论】:

代码被剪掉了。这是它上面的内容:&lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" &gt; &lt;input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" &gt;&lt;/input&gt; &lt;/form&gt; 虽然在IE8下不行,但是用真正的浏览器就行了。【参考方案6】:

创建多文件上传需要做一些事情,实际上它非常基本。您不需要使用 Java、Ajax、Flash。只需构建一个正常的文件上传表单:

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

然后是成功的关键;

&lt;input type="file" name="file[]" multiple /&gt;

不要忘记那些括号! 在 post_upload.php 中尝试以下操作:

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

请注意,您会得到一个包含 tmp_name 数据的数组,这意味着您可以使用第三对括号访问每个文件,其中包含文件“编号”示例:

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

您可以使用 php count() 来计算被选中文件的数量。祝你好运!

【讨论】:

感谢您的提示!它为我节省了很多时间 +1 它工作得很好......但我在 Internet Explorer (v8) 中以这种方式上传时遇到了问题。我觉得IE不支持这种方式上传。 或者您可以使用foreach 语句循环浏览文件,而无需知道上传的文件数量... 请注意,如果您在 html 中使用您的姓名中的键,例如name="file[3]",那么您需要通过 $_FILES['file']['tmp_name'][3] 访问该值,以防不明显。【参考方案7】:

首先你应该制作这样的表格:

<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/>';

?>

这很容易......完成

【讨论】:

【参考方案8】:

我创建了一个用于上传多张图片的 php 函数, 此功能可以上传特定文件夹中的多张图片,也可以将记录保存到数据库中 在下面的代码中 $arrayimage 是通过表单发送的图像数组 请注意,它不允许上传使用多个,但您需要创建具有相同名称的不同输入字段,因为您可以在按钮单击时设置文件的动态添加字段。

$dir 是你要保存图片的目录 $fields 是您要存储在数据库中的字段的名称

数据库字段必须是数组格式 例子 如果您有数据库图像存储和字段名称,例如 id、名称、地址,那么您需要发布数据,例如

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

然后将该字段传递给函数 $fields

$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类到此结束

您可以尝试使用此代码插入多个带有扩展名的图像 此功能是为检查图像文件而创建的,您可以替换代码中特定文件的扩展名列表

【讨论】:

大家好,我使用文件输入将文档附加到自动生成的电子邮件中。我可以一次附加多个文档,但是,我想附加来自不同目录的多个文档。目前,如果我这样做,我当前选择的文档将被我选择的新文档替换。请问我该怎么做。谢谢【参考方案9】:
<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.";                               
                       

                   
  
?>

【讨论】:

以上是关于如何使用 HTTP POST 使用 HTML 和 PHP 选择和上传多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

get和post

Python HTTP服务器在POST和GET请求时没有响应

VUE中 axios GET和POST 如何使用

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

如何使用 http.post 上传文件和表单数据

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)