我正在寻找一种使用 Ajax Post 上传文件夹的方法。我发现的帖子(cp. File Entries from drop event)回答了如何获取文件条目,但是当我发布它们时,服务器只接收文件名。不是数据。现在我正在寻找一种实际加载文件的方法。由于我是 js 新手,我不知道如何前进。
我发现的剪辑是这样的:
// Drop handler function to get all files
async function getAllFileEntries(dataTransferItemList) {
let fileEntries = [];
// Use BFS to traverse entire directory/file structure
let queue = [];
// Unfortunately dataTransferItemList is not iterable i.e. no forEach
for (let i = 0; i < dataTransferItemList.length; i++) {
queue.push(dataTransferItemList[i].webkitGetAsEntry());
}
while (queue.length > 0) {
let entry = queue.shift();
if (entry.isFile) {
fileEntries.push(entry);
} else if (entry.isDirectory) {
queue.push(...await readAllDirectoryEntries(entry.createReader()));
}
}
return fileEntries;
}
// Get all the entries (files or sub-directories) in a directory
// by calling readEntries until it returns empty array
async function readAllDirectoryEntries(directoryReader) {
let entries = [];
let readEntries = await readEntriesPromise(directoryReader);
while (readEntries.length > 0) {
entries.push(...readEntries);
readEntries = await readEntriesPromise(directoryReader);
}
return entries;
}
// Wrap readEntries in a promise to make working with readEntries easier
// readEntries will return only some of the entries in a directory
// e.g. Chrome returns at most 100 entries at a time
async function readEntriesPromise(directoryReader) {
try {
return await new Promise((resolve, reject) => {
directoryReader.readEntries(resolve, reject);
});
} catch (err) {
console.log(err);
}
}
我的 drop 事件如下所示:
elDrop.addEventListener('drop', async function (event) {
event.preventDefault();
let items = await getAllFileEntries(event.dataTransfer.items);
elItems.innerHTML = items.length;
$.ajax({
type: 'POST',
url: '{% url 'user:upload' %}',
dataType: "application/binary",
data: items,
success: function () {
alert('success')
}
});
});