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

Firefox 如何检测到用户将文件夹(而不是文件)拖到浏览器中?,firefox,browser,file-upload,drag-and-drop,webkit,Firefox,Browser,File Upload,Drag And Drop,Webkit,我很清楚,你不允许通过拖放上传整个文件夹。问题是,我如何判断是否有人试图这么做?如果将文件夹拖动到浏览器中,其行为与拖动具有webkit不知道的扩展名(如“.sh”)的文件完全相同。你怎么能分辨出区别呢 我已经在Mac OS X和Windows上的Chrome、Safari和Firefox中测试过这一点。根据浏览器和操作系统的不同,我得到的结果略有不同。有时它会成功上传一个零字节的文件。有时它会上传文件夹的图片。有时它无法上传任何东西 event.dataTransfer.types和event

我很清楚,你不允许通过拖放上传整个文件夹。问题是,我如何判断是否有人试图这么做?如果将文件夹拖动到浏览器中,其行为与拖动具有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"}

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

例如,在chrome中


它将显示“索引D:\my documents\Downloads\”以及您修改文件的名称、大小和日期…

我找到了一种方法。这些信息可以通过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)

在FF中有一种数据传输方法:mozGetDataAt(类型,索引),当我使用类型“text/x-moz-url”时,它返回文件的路径,如files:///D:/abc/fileName'. 有趣的是,文件夹/指令的路径末尾带有“/”,如files:///D:/abc/folder1/'. 我想知道它在这种情况下是否有效?

不是我的意思。我说的是使用拖放API。您描述的行为是当浏览器导航到文件:///url时。这不是我在网络服务中可以利用的。你好,尼克,谢谢你的回答。你能告诉我你在上面写了什么样的结构吗?我从未在JavaScript中见过它,尤其是字符->。我想了解和研究它,但我现在不知道它叫什么。谢谢,这是咖啡脚本。要查看等效的JavaScript,请将其粘贴到Try CoffeeScript框中。不要在回答部分发布问题。