Firefox 3.6 中的多文件输入

Firefox 3.6 支持 多文件输入。此项新功能允许您使用标准技术一次获得多个文件作为输入,这是一个巨大的改进,因为您以前只能一次输入一个文件,或者需要使用第三方(专有)应用程序。这将特别有用,例如,用于照片上传。

输入标签

要让用户选择本地文件,请在网页上使用输入标签。这将向用户显示文件选择器。

在 Firefox 3.6 中,输入标签已扩展为支持多文件。

用户仍然会看到相同的文件选择器,但可以选择多个文件。

表单标签

您仍然可以使用经典的 form 机制。

如果服务器端代码是用 PHP 编写的,请不要忘记确保 name 属性的值带有方括号。方括号不是来自 HTML 规范,但需要将请求结果作为数组进行处理(参见 PHP 文档)。

以下是一个示例,它遍历文件列表并打印每个文件名。

foreach ($_FILES['uploads']['name'] as $filename) {
    echo '
  • ' . $filename . '
  • '; }

    使用文件 API

    Firefox 3.6 还支持 文件 API。这允许您在将文件发送到服务器之前对客户端进行额外的处理。您可以使用输入 DOM 元素的 files 属性访问选定的文件,然后使用文件 API 对文件进行操作。

    例如,以下是如何获取用户选择的每个文件名的示例。与之前的 PHP 示例不同,这是在客户端完成的。

      var input = document.querySelector("input[type='file']");
      // You've selected input.files.length files
      for (var i = 0; i < input.files.length; i++) {
        // input.files[i] is a file object
        var li = document.createElement("li");
        li.innerHTML = input.files[i].name;
        ul.appendChild(li);
      }
    

    演示

    在我们的 多文件输入演示 中查看此机制的实际效果。您需要 Firefox 3.6(测试版)。

    文档

    要详细了解多文件输入,请查看 MDC 上的文档

    关于 Paul Rouget

    Paul 是一名 Firefox 开发人员。

    Paul Rouget 的更多文章...


    28 条评论

    1. Drazick

      太棒了!
      希望 Gmail 很快就会使用它。

      我们想要 FF 3.6!:-).

      2009 年 12 月 10 日 下午 2:37

    2. ben

      迫不及待!太棒了!

      2009 年 12 月 10 日 下午 3:10

    3. Aryeh Gregor

      multiple=”true” 不是有效的 HTML5。您想要 multiple=”multiple” 或 multiple=””,或者(如果使用 HTML 序列化)直接使用 multiple。请自行查看

      http://validator.nu/?doc=data%3Atext%2Fhtml%2C%3C!DOCTYPE+html%3E%3Ctitle%3E%3C%2Ftitle%3E%3Cform%3E%3Cinput+type%3D%22file%22+multiple%3D%22true%22%3E%3C%2Fform%3E

      虽然这是有效的

      http://validator.nu/?doc=data%3Atext%2Fhtml%2C%3C!DOCTYPE+html%3E%3Ctitle%3E%3C%2Ftitle%3E%3Cform%3E%3Cinput+type%3Dfile+multiple%3E%3C%2Fform%3E

      我昨天在 W3C FileAPI 文章中也指出了这一点,但我的评论似乎没有得到批准。Mozilla 不应该鼓励使用无效的 HTML — 如果人们看到使用了 multiple=”true”,他们会期望 multiple=”false” 能按预期工作,而它不会(它与 multiple=”true” 的处理方式完全相同)。

      2009 年 12 月 10 日 下午 3:31

    4. Jason

      这是一个很棒的功能!它会在其他浏览器上优雅降级吗?

      我想我会做一些测试并写一篇关于它的文章。:D

      2009 年 12 月 10 日 下午 3:32

    5. Arc

      @Jason
      您可以使用 JavaScript 检测是否支持 ‘multiple’,如果不支持,则可以使用允许使用多个文件输入字段的旧方法。
      input = createElement(‘input’)
      input.type = ‘file’
      input.name = ‘file[]’
      fieldset.appendChild(input)

      2009 年 12 月 10 日 下午 4:13

    6. Arun Ranganathan

      @Aryeh,你说得完全正确。我不确定为什么你的评论没有被批准,但我已经修改了文件 API 文章的文本。感谢您的评论 :-)

      2009 年 12 月 10 日 下午 5:05

    7. Jose

      我们刚刚为我们的内部网站实现了这一点,由于目前只有我们自己使用它,因此更新每个人到 FF 3.6 没有问题。

      我们很快想改进我们的内部系统,以便在另一个方向允许多个文件下载,但没有先压缩它们。似乎这不可能吗?

      2009 年 12 月 10 日 下午 5:33

    8. paul

      @Aryeh,你说得对。我已经更新了这篇文章。

      2009 年 12 月 10 日 下午 5:35

    9. ben

      @Aryeh 你观察得真敏锐。

      2009 年 12 月 10 日 下午 6:51

    10. […] 之前的一篇文章中,我们向您展示了如何使用 input 元素上传多个文件。在 Firefox 3.6 中,您可以让 […]

      2009 年 12 月 14 日 下午 12:37

    11. […] 之前的文章中,我们展示了如何通过 input 标签或通过拖放机制访问文件。在这两种情况下,您可以使用 XMLHttpRequest 上传 […]

      2009 年 12 月 15 日 上午 11:01

    12. K

      @Jose
      您可以 使用 event.dataTransfer.setData 添加链接列表 并让文件管理器处理下载。

      2009 年 12 月 17 日 上午 1:14

    13. Chris

      看起来很棒.. 但我认为更多的输入会更人性化…

      您将如何从不同的目录中选择文件?

      2010 年 1 月 7 日 下午 9:51

    14. […] koennen per Drag & Drop auf Seiten hochgeladen werden. Siehe […]

      2010 年 1 月 21 日 下午 12:00

    15. jpvincent

      很高兴看到 HTML5 功能正在被 Mozilla、webkit 和 opera 一一实现。
      但作为 Web 开发人员,我只能等待主要 JS 库制造商(jQuery、YUI …)做一些事情来处理跨浏览器差异,因为 HTML5 规范尚未确定,还需要处理旧浏览器以提供备用解决方案(在多上传的情况下,Flash 上传器是唯一的选择)

      您是否认为让整个 Web 从这些新功能中受益的唯一方法是帮助 JS 库制造商?
      这篇文章中有更多论点(法语)
      http://jpv.typepad.com/blog/2010/01/features-html5-appel-aux-armes-pour-les-librairies-js.html

      2010 年 1 月 22 日 下午 2:29

    16. […] Mozilla) […]

      2010 年 1 月 24 日 上午 4:36

    17. Nitin Reddy Katkam

      Firefox 3.6 中的实现只允许用户在文件位于同一个目录下时选择多个文件(在文件打开对话框中使用 Shift 或 Ctrl)。用户是否可以从多个目录中选择文件?

      2010 年 1 月 24 日 上午 4:38

    18. […] – 3.6 – 最好的浏览器(在我看来)。我读到在这个版本中它支持多文件上传。因此,我为 Joomla(1.5)添加了一个补丁来支持它。这个补丁使上传成为原生 PHP-HTML 和 […]

      2010 年 1 月 27 日 下午 1:55

    19. […] 原文:https://hacks.mozilla.ac.cn/2009/12/multiple-file-input-in-firefox-3-6/ […]

      2010 年 5 月 17 日 上午 5:02

    20. Rafael

      似乎无法从 FileList 对象中删除文件。delete 运算符似乎无法从对象中删除其单个属性(即文件,在对象中命名为 0、1 等),因为它只读(如规范中所述:http://www.w3.org/TR/FileAPI/#dfn-filelist)。这是一个相当大的缺点,因为用户可能希望在上传所需文件之前从列表中删除一两个文件。

      2010 年 6 月 23 日 下午 3:55

    21. dima

      但作为下载。要让它在所有浏览器上都能工作?包括 IE?

      2010年7月31日 下午8:16

    22. pd

      有人知道如何在服务器端使用Perl处理input type=file multiple=true标签吗?

      2010年8月10日 上午3:22

      1. Glen

        是的,只需在列表上下文中访问上传的文件,而不是标量,您将获得一个文件句柄列表。示例

        my $q = new CGI;

        my @filehandles = $q->upload(‘files’);

        现在您可以循环遍历文件句柄以处理每个文件,如果用户选择1个或多个文件,此方法有效。

        注意:以下是支持此功能的html代码片段

        2011年3月1日 上午10:14

    23. eric

      您好,
      您可以在EmbedUpload.com中将多个文件上传到多个文件托管网站(到您的帐户)。
      试试吧。

      2010年8月28日 下午12:26

    24. […] 也自动验证。通过传递多个属性(在 type=”email” 上也有效),您还可以验证以逗号分隔的邮件列表。<input type="email" […]

      2010年11月11日 上午10:21

    25. […] 值得注意的是,Flickr 仍然使用 Flash 模块来允许选择多个文件,而大多数现代浏览器都提供多个文件发送功能。[…]

      2011年4月4日 下午1:18

    26. Tim

      我不知道如何移动它。我可以让简单的 php 代码工作,但提供 move_uploaded_file($_FILES[‘uploads’][‘tmp_name’], $_FILES[‘uploads’][‘name’]); 不起作用。

      2011年8月29日 下午2:11

    27. iSodaPH

      如何获取文件路径?

      2011年12月29日 上午0:12

    本文评论已关闭。