如何检测用户将文件夹(而不是文件)拖入浏览器?

时间:2012-09-27 00:06:08

标签: firefox browser file-upload drag-and-drop webkit

我非常清楚你不能通过拖放上传整个文件夹。问题是,如何判断某人是否尝试这样做?如果您将一个文件夹拖到浏览器中,它的行为就像拖动一个带有webkit不知道的扩展名的文件,就像'.sh'一样。你怎么能分辨出来呢?

我已经在Mac OS X和Windows上的Chrome和Safari以及Firefox中对此进行了测试。根据浏览器和操作系统的不同,我会得到略有不同的结果。有时它会成功上传零字节文件。有时它会上传文件夹的图片。有时它无法上传任何内容。

event.dataTransfer.types和event.dataTransfer.items都说谎并且分别说“File”或“file”。

Firefox提供了以下类型列表:

{"0":"application/x-moz-file","1":"text/x-moz-url","2":"text/plain","3":"Files"}

3 个答案:

答案 0 :(得分:1)

我找到了办法。这些信息可以通过getAsEntry在dataTransfer.items中找到,尽管在不同的浏览器中它们有点不同。此外,这没有指向您想要的文件的指针,尽管您可以根据文件名找出它,假设您没有同时上传两个具有相同名称的文件。在这里工作并不多,所以这是我能做的最好的事情。

just_the_files = (dataTransfer) ->
    real_files_set = {}
    for item in dataTransfer.items
        entry = item.getAsEntry?() or item.webkitGetAsEntry?() or item
        if entry.isFile
            real_files_set[entry.name] = true
     (file for file in dataTransfer.files when file.name of real_files_set)

答案 1 :(得分:-1)

实际上当您将文件夹拖到浏览器上时,将显示您拖动的文件夹中的所有文件夹和文件..

例如在chrome

它会显示“D:\ my documents \ Downloads \”的索引以及修改文件的名称,大小和日期......

答案 2 :(得分:-1)

在FF中有一个dataTransfer的方法: mozGetDataAt (类型,索引),当我使用类型'text / x-moz-url'时,它返回文件的路径,如'files:/ // d:/ ABC /文件名”。有趣的是,文件夹/指令在末尾有一个带'/'的路径,如'files:/// D:/ abc / folder1 /'。我想知道它是否适用于这种情况?