【发布时间】:2016-11-11 21:42:31
【问题描述】:
我正在尝试创建一个可以拖动图像文件进行上传的下拉框。这在 Chrome 和 Edge 中运行良好。但是,我在 Firefox 和 IE 11 中遇到了问题。例如,在 IE 11 中,当我单击浏览按钮时,会弹出一个窗口,标题为“选择要上传的文件”。如果我单击图像并单击“打开”它可以正常工作,但我无法将任何文件拖出窗口。但是,如果我打开文件资源管理器,我可以从文件资源管理器窗口拖放图像。类似的事情发生在 Firefox 中。我可以很好地从文件资源管理器中拖动图像,但是当我尝试从标题为“文件上传”的弹出窗口中拖动时,我得到一个带有圆圈和红色斜线的幽灵图像。这里的一些线程建议使用 dragstart 函数,但这似乎不起作用,可能是因为文档说“请注意,从操作系统将文件拖入浏览器时不会触发 dragstart 和 dragend 事件。” https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API
那么有没有一种方法可以让我从这些浏览器的文件上传窗口中拖动文件,而不必打开文件资源管理器?同样,我可以从 Chrome 和 Edge 的弹出窗口中拖放。
这是我的 HTML:
Files: <input type="file" id="fileInput" name="files" multiple><br />
<div id="selectedFiles"></div>
<div class="picList">
<div id="dropbox" style="border:1px solid black;height:500px;">
Drop Here
</div>
</div>
这是我的 javascript:
dropbox = document.getElementById("dropbox");
dropbox.addEventListener("dragenter", dragenter, false);
dropbox.addEventListener("dragover", dragover, false);
dropbox.addEventListener("drop", drop, false);
function dragenter(e) {
e.stopPropagation();
e.preventDefault();
}
function dragover(e) {
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
e.stopPropagation();
e.preventDefault();
var dt = e.dataTransfer;
var files = dt.files;
handleFiles(files);
}
有什么建议吗?
编辑:
这是我的 handleFiles 函数(dupCheck 是一个检查重复项的数组,存储文件是一个要上传的文件数组,我需要它是因为我希望用户能够通过删除预览图像和 HTML 来删除文件FileReader 是只读的,所以我不能直接从文件堆栈中删除单个图像。):
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
var imageType = /^image\//;
if (!imageType.test(file.type)) {
continue;
}
var img = document.createElement("img");
img.classList.add("obj");
img.file = file;
$(img).addClass('selFile');
$(img).attr('data-file', file.name);
var A = [];
for (var z = 0; z < dupCheck.length; z++) {
A.push(dupCheck[z].name)
}
if (!A.includes(file.name)) {
storedFiles.push(file);
var _checker = { name: file.name };
dupCheck.push(_checker);
dropbox.appendChild(img);
var reader = new FileReader();
reader.onload = (function (aImg) { return function (e) { aImg.src = e.target.result; }; })(img);
reader.readAsDataURL(file);
A = [];
};
}
}
【问题讨论】:
-
考虑使用库。这是我写的一个。 github.com/Pamblam/fileUpload
-
酷。我去看看。
-
您能否在问题中包含
handleFiles的文字? -
我编辑了我的问题以包含 handleFiles 代码。谢谢!
-
@Pennywise 另见How FileReader.readAsText in HTML5 File API works?
标签: javascript jquery html drag-and-drop