12

我有 64000 张小图像要上传到我的网站(使用现有验证,所以没有 FTP 等)。我已经为此创建了一个 HTML5 [multiple] type=file 输入,用于一百或数百个图像。几百不是问题。图像被批处理并发送到服务器。

但是当我选择一个包含 ~ 16000 张图像的文件夹时,文件输入的 FileList 为空...... onchange 事件触发,但文件列表为空。浏览器(或文件系统或操作系统?)似乎在选择这么多文件时遇到问题。

我创建了一个非常小的工具来帮助确定最大值:http: //jsfiddle.net/rudiedirkx/Ehhk5/1/show/

$inp.onchange = function(e) {
    var l = 0, b = 0;
    for (var i=0, F=this.files, L=F.length; i<L; i++) {
        l += F[i].name.length;
        b += F[i].size;
    }
    $nf.innerHTML += this.files.length + ' files: ' + (b/1000/1000) + ' MB / ' + l + ' chars of filename<br>';
};

它所做的只是计数:

  • 文件数
  • 所有文件名组合的字符数
  • 总文件大小的 MB 数

当我尝试这个时,我得到的最多:

1272 个文件:176.053987 MB / 31469 个字符的文件名

(在 32 和 64 位 Win7、Chrome 26-52 上)

下一个图像(失败)将是:

  • 1273张图片,没有明显的截断
  • 文件大小在 176 到 177 MB 之间,也不是明显的界限
  • 少于 32000 个字符的文件名,也不是一个明显的截断,虽然它可能看起来像 32k ......

在我的计算中,1 MB = 1000^2 字节,而不是 1024^2。(那将是一个 MiB,但也许我的操作系统/文件系统/浏览器不同意。)

我的问题是:为什么有这么多文件?为什么这个最大值?它是依赖于操作系统还是依赖于浏览器?我在哪里可以找到它的规格?是JS的错吗?搜索“文件输入最大文件”等只会导致 [max] 属性,这是无关紧要的。

更多测试结果:

  • 在 Firefox 中,最大值似乎要高得多。至少“2343 个文件:310.66553999999996 MB / 60748 个文件名字符”(这就是我在这里拥有的所有文件)
  • 在 Firefox 中:“16686 个文件:55.144415 MB / 146224 个文件名字符”(小得多,但文件更多)

更新

  • Chrome 52 canary Windows 还是 32k 的文件名
  • Firefox (44+) Windows 仍然是无限的
4

1 回答 1

20

为什么有这么多文件?

文件的数量取决于所有文件名组合的字符数。

为什么这个最大值?

在 Windows API 中,最大路径长度限制为 256 个字符,Unicode 版本 API 为 32,767 个字符。

Chrome 只是设置了 Unicode 版本 API 的最大路径长度,因此您观察到它大约是 32k 字符。
检查此修复:https ://code.google.com/p/chromium/issues/detail?id=44068

Firefox 动态分配一个足够大的缓冲区来容纳多个选定文件的大小,这可以处理更大的路径长度。
检查此修复:https ://bugzilla.mozilla.org/show_bug.cgi?id=660833

它是依赖于操作系统还是依赖于浏览器?

两个都。

我在哪里可以找到它的规格?

对于 Windows API 的使用和参考: http:
//msdn.microsoft.com/en-us/library/aa365247.aspx(最大路径长度限制)
http://msdn.microsoft.com/en-us/library/ms646839( VS.85).aspx

是JS的错吗?

不。

于 2013-05-02T05:44:04.270 回答