微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Javascript Dropbox API 上传大文件块

如何解决使用 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 举报,一经查实,本站将立刻删除。