如何解决使用 Javascript Dropbox API 上传大文件块
我正在使用此代码通过 Javascript (vuejs) 将文件上传到 DropBox;但是,我无法加载大于 350 MB 的文件。我一直在尝试使用块来加载文件。代码没有错误,但是当 dropBox api 返回结果时,我收到了 400 错误:
DropBox-sdk.min.js?0032:1 POST https://content.dropboxapi.com/2/files/upload_session/append_v2 400(错误请求)
我想知道代码是否有问题,或者是否需要在 DropBox 设置中更改某些内容?我一直在使用此代码作为指导:https://github.com/dropbox/dropbox-sdk-js/blob/master/examples/javascript/upload/index.html#L2
uploadToDropBox: function (path,file) {
var dbx = this.dropBox()
console.log("File upload .. " + path)
console.log("File upload .. " + file)
console.log(UPLOAD_FILE_SIZE_LIMIT)
if (file.size < UPLOAD_FILE_SIZE_LIMIT) {
this.dropBox().filesupload({ path: path,contents: file })
//__PIPELINE\assets\test
.then(response => {
console.log(response)
//this.structure = response.result.entries;
console.log("This was successful")
})
.catch(error => {
console.log(error)
console.log("This is an error")
});
}
else {
// File is bigger than 150 Mb - use filesuploadSession* API
const maxBlob = 8 * 1000 * 1000; // 8Mb - DropBox JavaScript API suggested max file / chunk size
var workItems = [];
var offset = 0;
while (offset < file.size) {
var chunkSize = Math.min(maxBlob,file.size - offset);
workItems.push(file.slice(offset,offset + chunkSize));
offset += chunkSize;
}
console.log ("Work Items : ")
console.log (workItems)
const task = workItems.reduce((acc,blob,idx,items) => {
if (idx == 0) {
// Starting multipart upload of file
console.log("idx is 0")
return acc.then(function () {
return dbx.filesuploadSessionStart({ close: false,contents: blob })
.then(response => response.session_id)
});
} else if (idx < items.length - 1) {
console.log("idx is less than items.length")
// Append part to the upload session
return acc.then(function (sessionId) {
var cursor = { session_id: sessionId,offset: idx * maxBlob };
return dbx.filesuploadSessionAppendV2({ cursor: cursor,close: false,contents: blob }).then(() => sessionId);
});
} else {
// Last chunk of data,close session
console.log("finishing session")
return acc.then(function (sessionId) {
var cursor = { session_id: sessionId,offset: file.size - blob.size };
var commit = { path: '/' + file.name,mode: 'add',autorename: true,mute: false };
return dbx.filesuploadSessionFinish({ cursor: cursor,commit: commit,contents: blob });
});
}
},Promise.resolve());
task.then(function (result) {
console.log(result)
//var results = document.getElementById('results');
//results.appendChild(document.createTextNode('File uploaded!'));
}).catch(function (error) {
console.error(error);
});
}
},
解决方法
代码中缺少会话 ID。
响应对象已在新版本的 sdk 中更新,示例代码不再起作用:
https://github.com/dropbox/dropbox-sdk-js/blob/master/UPGRADING.md#4-updating-the-response-object
修复正在改变这一行:
.then(response => response.result.session_id)
这是一个指向 github 上有相同问题的线程的链接: https://github.com/dropbox/dropbox-sdk-js/issues/351
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。