如何从拖放中POST文件(从文件API)

How to POST a file (from File API) from drag and drop

本文关键字:文件 API 拖放 POST      更新时间:2023-09-26

我有一个文件上传页面,通过拖放选择文件。由于该文件是插入的(而不是使用传统的字段),因此我通过javascript文件API向我公开了该文件。

我一直在阅读Mozilla的这篇文章,但我对异步上传它不太感兴趣(因为我有一些其他数据需要与文件一起提交,但我找到的所有资源都是用XHR来完成的。

以下是我设法拼凑出来的:

function handleFileSelect(evt) {
    evt.toElement.className = "";
    evt.stopPropagation();
    evt.preventDefault();
    var files = evt.dataTransfer.files; // FileList object.
    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, file; file = files[i]; i++) {
        var f = file;
        var reader = new FileReader();
        reader.onload = function(e) {
          var bin = e.target.result;
          // bin is the binaryString
        };
        reader.readAsBinaryString(file);
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "{% url micro-upload %}");
        xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
        xhr.sendAsBinary(bin);
        output.push('<li><strong>Uploaded:</strong><em>', escape(f.name), '</em> (', f.type || 'n/a', ') - ',
                    f.size, ' bytes, last modified: ',
                    f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                    '</li>');
    }
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
}

然而,在服务器端,Django并不喜欢这样。它抱怨POST数据格式错误。

理想情况下,我认为我的解决方案是:

  1. 用户将文件拖放到页面上
  2. 文件添加到隐藏文件<input>
  3. 文件将与表单数据的其余部分一起张贴

我知道大多数浏览器都允许您将文件拖到文件<input>上,但我希望有一个更大的自定义样式的拖放目标。

xhr.sendAsBinary()不是标准配置。你想过使用FormData吗?这将允许您将文件(和其他属性)附加到mime多部分请求。。。本质上就是form.post()的作用。请在此处查看我的响应,了解如何执行此操作的代码。