HTML5拖放 - 检测Safari中的文件夹(FileList,File)

时间:2011-02-01 00:57:37

标签: html5 safari drag-and-drop filter directory

我在JS(AJAX POST)中设置了一个拖放文件上传脚本,我在Safari中过滤文件夹时遇到了困难 - 版本5.0.3(6533.19.4)。

每当我将多个文件/文件夹放入浏览器时,Chrome都会过滤掉这些文件夹,Firefox会为.size返回0,因此防止这些情况变得微不足道。 但是,Safari将返回一个68字节的文件(文件夹的大小)。

有没有办法测试此File({1}}中的项目)是否为文件夹? 似乎无法在File/Blob API中找到测试此条件的任何内容(尝试FileList时没有意义,因为它不会为未知文件和文件夹返回任何内容......)

更多信息:

基本上发生的事情是AJAX请求有一个空体。我正在上传.type

FormData

3 个答案:

答案 0 :(得分:0)

您可以使用原始发布数据检测服务器上的文件或文件夹: Get raw post data

我注意到文件夹在开头只有表格边界而在结尾处没有。所以基本上看起来浏览器开始做帖子然后在完成请求之前停止。 (我只用safari测试过这个,但我猜它和其他浏览器一样。)

您可以在会话中保存失败的上传,然后使用AJAX来测试失败的上传是否产生了这样的请求。你有一个aditional AJAX请求,但至少你可以检测到它。这是我到目前为止找到的最佳选择。

答案 1 :(得分:0)

我们可以使用FileReader读取文件。代码可以是这样的:

Array.prototype.forEach.call(e.dataTransfer.files, function (file) {
  var reader = new FileReader();
  reader.onload = function (event) {
    // it's a file
    addFile(file);
  };
  reader.onerror = function (event) {
    alert("Uploading folders not supported in Safari");
  }
  reader.readAsDataURL(file);
});

对于文件夹,它会给出错误:

Failed to load resource: The operation couldn’t be completed. (WebKitBlobResource error 4.)

答案 2 :(得分:-2)

为什么不检查oldschool文件后缀?应该适用于“file.suf”是文件而“文件”是文件夹的大多数情况......