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

sta*_*zel 143 html php upload post http

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

例如,我希望能够一次性选择一系列图像,然后将它们上传到服务器.

如果可能的话,使用单个文件输入控件会很棒.

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

Mar*_*ase 184

这在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>
Run Code Online (Sandbox Code Playgroud)

在文件对话框中选择2个项目后,这就是Chrome中的样子:

chrome多文件选择

这是单击"上传"按钮后的样子.

向PHP提交多个文件

这只是一个完整工作答案的草图.有关在PHP中正确,安全地处理文件上载的更多信息,请参阅PHP手册:处理文件上载.

  • 我相信它是有效的:http://thoughtresults.com/html5-boolean-attributes.如果添加<!doctype html>,它会传递w3c验证器. (10认同)
  • 如果没有添加属性**名称**(例如`name ="file []"`),它就无法工作.我试图[编辑答案](http://stackoverflow.com/review/suggested-edits/4446753),但它被拒绝了. (10认同)
  • 它是否通过了w3c验证,还是应该是`multiple ="multiple"`? (8认同)
  • 是的,它可能验证HTML,但使XHTML失败。尽管我仍然喜欢使用XHTML,但我认为人们建议不要使用XHTML。 (2认同)

小智 92

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

<form enctype="multipart/form-data" action="post_upload.php" method="POST">
Run Code Online (Sandbox Code Playgroud)

那么成功的关键;

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

别忘了那些括号!在post_upload.php中尝试以下方法:

<?php print_r($_FILES['file']['tmp_name']); ?>
Run Code Online (Sandbox Code Playgroud)

请注意,您将获得一个包含tmp_name数据的数组,这意味着您可以使用带有文件"number"示例的第三对括号访问每个文件:

$_FILES['file']['tmp_name'][0]
Run Code Online (Sandbox Code Playgroud)

您可以使用php count()来计算所选文件的数量.古德勒克widdit!

  • 谢谢你的提示!它为我节省了这么多时间+1 (5认同)
  • 或者你可以用`foreach`语句遍历文件,而不必知道上传的文件数量...... (4认同)

Tha*_*aps 7

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>
Run Code Online (Sandbox Code Playgroud)

  • 它虽然在IE8中不起作用,但只是使用真正的浏览器. (3认同)

小智 6

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

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 
Run Code Online (Sandbox Code Playgroud)

没错。现在将此代码添加到您的表单代码下或您喜欢的任何页面上

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

这很容易...完成


ant*_*ove 6

<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>
Run Code Online (Sandbox Code Playgroud)

使用 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}.";                               
      }                 

    }               
  }    
?>
Run Code Online (Sandbox Code Playgroud)

使用 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}.";                               
      }                 

    }               
  }
?>
Run Code Online (Sandbox Code Playgroud)


Mit*_*aro 5

如果要从选择浏览时显示的文件选择器对话框中选择多个文件,那么您运气不佳.您将需要使用Java applet或类似的东西(我认为有一个使用小型Flash文件,如果我找到它,我会更新).目前,单个文件输入仅允许选择单个文件.

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


更新:有一种方法可以使用一个使用闪存的"浏览"按钮.我从未亲自使用过这个,但我已经阅读了相当多的内容.我认为这是你最好的一击.

http://swfupload.org/