问题 使用HTML / JavaScript检测本地文件拖放


有一个HTML textarea。我能够抓住那个事件 本地文件 被拖放到textarea上。但 如何获取被删除文件的名称? (最后要修改并插入textarea。)

在这种情况下,以下表达式返回None:

event.dataTransfer.files
event.dataTransfer.getData('text/plain')

我做了一个简短的例子 Firefox 3 那是我目前的目标平台。

<script>
function init() {
    document.getElementById('x').addEventListener('drop', onDrop, true)
}
function onDrop(event) {
    var data = event.dataTransfer.getData('text/plain')
    event.preventDefault()
    alert('files: ' + event.dataTransfer.files + ' && data: ' + data + '.')
}
</script>

<body onload='init()'>
<textarea cols=70 rows=20 id='x'></textarea>

6914
2018-01-07 05:53


起源

我想要本地文件路径ondrop。 - Kishan


答案:


这有点晚了 - 但我认为你要找的是:

event.dataTransfer.files[0].name

您还可以获得以下属性:

event.dataTransfer.files[0].size
event.dataTransfer.files[0].type

您可以使用以下内容循环访问这些文件:

var listOfNames='';
for(var i=0,tot=event.dataTransfer.files.length; i<tot; i++){
    listOfNames+=event.dataTransfer.files[i].name + '\r\n';
}

顺便说一下 - 如果你使用的是jQuery,那么可以在这里找到dataTransfer对象:

event.originalEvent.dataTransfer.files[0].name

13
2017-09-27 13:46



我想要本地文件路径ondrop。 - Kishan
你可以找到它,如果你控制日志文件对象,使用类似的东西(假设你使用的是jQuery): console.log(event.originalEvent.dataTransfer.files[0]) - Jimmery


不知道它是否仍然相关,但我遇到了同样的问题。这是我解决它的方式:

  1. 使用单个输入字段创建普通上载表单(type =“file”)
  2. 将此HTML属性添加到输入字段:

    dropzone =“copy file:image / png file:image / jpg file:image / jpeg”

  3. 设置JQuery监听器或其他什么来捕获输入字段上的“drop”-event

在输入字段上拖放本地图像时,“value”属性会自动填充,您可以像处理任何其他HTML表单一样处理它。

我还将表单包装到另一个HTML元素(div)中,设置div的大小并设置overflow:通过CSS隐藏 - 这样,你可以摆脱“浏览”按钮。这不好,但它确实有效。我也用过 给ajaxForm 插件在后台上传图片 - 效果非常好。


4
2018-03-06 18:34



“当您在输入字段上拖放本地图像时,”value“属性会自动填充,您可以像处理任何其他HTML表单一样处理它”你能更好地解释一下吗?我尝试但我无法理解如何将值设置为输入类型文件。这不应该被拒绝导致一些安全隐患吗? - Lorenzo Sciuto
据我所知,你不必明确地做任何事情。但是,为了处理带有图像的表格,输入字段必须具有值。此值无法通过Javascript设置。但是,如果将图像拖放到输入字段,则会自动设置“value”属性并提交表单。 - Jan Petzold


据我所知,你需要获得一个实例 nsIFile 为了获得文件路径( File class不提供此功能)。
此MDC页面说明了如何执行此操作: https://developer.mozilla.org/En/DragDrop/Recommended_Drag_Types#file
请注意,虽然未在上一个链接中列出,但获得了 nsIFile 实例需要特权升级(参见我的答案) 我可以将文件从桌面拖到Firefox 3.5中的放置区域并启动上传吗? 说明如何做到这一点)。


0
2018-03-09 16:51



MDC ......你的意思是MDN :-) - Steel Brain


我通过检测鼠标悬停和“丢弃”区域上的mousedown来做到这一点


0
2018-01-17 14:55





Alemjerus是正确的,你无法访问你正在寻找的东西。

您在回复评论时提到的行为是某些浏览器的默认行为。例如,对于此条目的stackoverflow textarea,如果我使用Safari并将文件拖入其中,则会将文件的路径放入textarea。另一方面,使用firefox 3.5,它会尝试使用浏览器打开文件。

基本上,您尝试实现的“拖放”功能是由客户端计算机上的浏览器和操作系统处理的 - 您无法使用Javascript实现此目的。


-2
2018-01-08 22:14



我知道JS中存在安全性。但在这种特殊情况下,你和alemjerus是错误的。安装Firefox 3.6并运行纯html / js示例: developer.mozilla.org/En/DragDrop/DataTransfer#Example  而且您不仅可以访问文件名,还可以访问其内容。我无法挖掘的唯一一件事就是如何获得 充分 文件路径... - Pavel Vlasov
alemjerus和Skone 是 事实上是对的。 Firefox 3.6中添加了本地文件访问(developer.mozilla.org/en-US/Firefox/Releases/3.6#HTML)最初于2010年1月21日发布(en.wikipedia.org/wiki/Firefox_3.6)他们发布答案后。 stackoverflow上用于标记过时答案的功能非常棒。 - Jenny O'Reilly


出于安全原因,您无法使用Javascript执行此操作。 Javascript VM无法直接访问OS文件系统。您只能拖放文字。


-3
2018-01-07 09:57



但它不是通常的直接访问:用户按照自己的意愿删除文件。而应用程序只需要一个文件名,而不是更多。这有什么不对?例如,以下可视化编辑器是 能够 获取已删除文件的名称(不幸的是,您需要登录): livejournal.com/update.bml 它仍然由HTML构成。 - Pavel Vlasov
不再是真的了。任何具有dataTransfer.files的浏览器都可以读取文件名。 - Jimmery