【问题标题】:How to select multiple files with <input type="file">?如何使用 <input type="file"> 选择多个文件?
【发布时间】:2010-12-08 06:30:55
【问题描述】:

&lt;input type="file"&gt;如何选择多个文件?

【问题讨论】:

  • 这是关于javascript和html的
  • 你的意思是一次上传多个文件(一次选择一个然后点击上传)?还是您的意思是使用 ctrl+click 在一个浏览器窗口中选择多个文件?
  • 您可以在 HTML5 中使用 input 元素上的 multiple 属性来实现。 这是一个很好的小提琴:jsfiddle.net/0GiS0/Yvgc2

标签: javascript html file-upload


【解决方案1】:

新答案:

在 HTML5 中,您可以添加 multiple 属性来选择多个文件。

<input type="file" name="filefield" multiple="multiple">

旧答案:

每个&lt;input type="file" /&gt; 只能选择 1 个文件。如果你想 发送多个文件,您将不得不使用多个输入标签或使用 Flash 或 Silverlight。

【讨论】:

  • Gmail 使用 Flash 来做到这一点
  • 自 HTML5 以来没有。输入字段有多个属性。
  • @Costa 在 2009 年 10 月 20 日,大多数浏览器不支持该功能,而 Niavlys 早在 2 年前就展示了 html5 解决方案。
  • 这个答案比恐龙还要古老
  • this multiple="multiple" 对用户不友好,普通用户不理解,甚至不知道“ctrl 按钮”的作用,并且无法选择不同文件夹中的文件。
【解决方案2】:

还有 HTML5 &lt;input type="file" multiple name="files[]" /&gt; (specification)。

浏览器支持在桌面上非常好(只是不支持 IE 9 和更早版本),在移动设备上不太好,我猜是因为根据平台和版本更难正确实现。

【讨论】:

  • IE9 及之前版本不支持 :(
  • 考虑添加name="files[]"
  • type="file[]" 不是我在任何标准中都可以找到的,应该导致兼容的浏览器将其解释为type="text"。只需multiple 就足够了。
  • @Thomas 是的。名称中的括号不是规范的一部分。浏览器不在乎,也不会更改名称(意味着它不会添加任何索引)。这主要用于需要这些括号的目标脚本,例如 PHP。浏览器将对所有传输的文件使用相同(相同)的名称。在此示例中,所有文件都将具有相同的名称“file[]”。
  • @StanE 我认为您将type="file[]"name="file[]" 混淆了。
【解决方案3】:

这个 jQuery 插件 (jQuery File Upload Demo) 不使用 flash,它使用的形式是:

<input type='file' name='files[]' multiple />

【讨论】:

【解决方案4】:

整个事情应该是这样的:

<form enctype='multipart/form-data' method='POST' action='submitFormTo.php'> 
    <input type='file' name='files[]' multiple />
    <button type='submit'>Submit</button>
</form>

确保你的&lt;form&gt;标签中有enctype='multipart/form-data'属性,否则提交后无法读取服务器端的文件!

【讨论】:

  • 除非你使用 websocket 或 ajax 提交
【解决方案5】:

您现在可以使用 HTML5 来实现

本质上,您在文件输入上使用了 multiple 属性。

<input type='file' multiple>

【讨论】:

  • 对这个东西的支持怎么样? Canisuse.com 没有相关信息。
  • 我不确定,我检查了同一个地方,哈哈。
  • FileReader 没有 .name 属性,因此您示例中的标题始终为 undefined: jsfiddle.net/m5jeyeyt/1
【解决方案6】:

HTML5 为 type 属性为 file 的 input 元素提供了新的属性 multiple。 所以可以选择多个文件,IE9及以前的版本不支持这个。

注意:请注意输入元素的名称。 当你想上传多个文件时,你应该使用数组而不是字符串作为 名称属性。

例如:input type="file" name="myPhotos[]" multiple="multiple"

如果您使用的是 php,那么您将在 $_FILES 和 使用 var_dump($_FILES) 并查看输出并进行处理 现在您可以迭代并完成剩下的工作

【讨论】:

    【解决方案7】:
    <form action="" method="post" enctype="multipart/form-data">
    <input type="file" multiple name="img[]"/>
    <input type="submit">
    </form>
    <?php
    print_r($_FILES['img']['name']);
    ?>
    

    【讨论】:

      【解决方案8】:

      复制并粘贴到您的 html 中:

      <input type="file" id="files" name="files[]" multiple />
      <output id="list"></output>
      
      <script>
      function handleFileSelect(evt) {
      var files = evt.target.files; // FileList object
      
      // files is a FileList of File objects. List some properties.
      var output = [];
      for (var i = 0, f; f = files[i]; i++) {
        output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                    f.size, ' bytes, last modified: ',
                    f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                    '</li>');
      }
      document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
      }
      

      这是通过我从这个网页上告诉你的:http://www.html5rocks.com/en/tutorials/file/dndfiles/

      【讨论】:

        【解决方案9】:

        这很容易......

        <input type='file' multiple>
        $('#file').on('change',function(){
             _readFileDataUrl(this,function(err,files){
                   if(err){return}
                   console.log(files)//contains base64 encoded string array holding the 
                   image data 
             });
        });
        var _readFileDataUrl=function(input,callback){
            var len=input.files.length,_files=[],res=[];
            var readFile=function(filePos){
                if(!filePos){
                    callback(false,res);
                }else{
                    var reader=new FileReader();
                    reader.onload=function(e){              
                        res.push(e.target.result);
                        readFile(_files.shift());
                    };
                    reader.readAsDataURL(filePos);
                }
            };
            for(var x=0;x<len;x++){
                _files.push(input.files[x]);
            }
            readFile(_files.shift());
        };
        

        【讨论】:

        • 这个已经回答清楚了。需要添加一个javascript示例吗?
        • 因为它很好?
        【解决方案10】:

        HTML5 为 type 属性为 file 的 input 元素提供了新的属性 multiple。所以可以选择多个文件,IE9及以前的版本不支持这个。

        注意:请注意输入元素的名称。当你想上传多个文件时,你应该使用数组而不是字符串作为名称属性的值。

        例如:

        input type="file" name="myPhotos[]" multiple="multiple"
        

        如果您使用的是 php,那么您将在 $_FILES 中获取数据并使用 var_dump($_FILES) 并查看输出并进行处理 现在您可以迭代并完成其余的工作

        【讨论】:

          猜你喜欢
          • 2015-10-10
          • 2011-04-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-21
          相关资源
          最近更新 更多