我有一个表格,可以通过API上传到Dropbox。通过将文件分成多个块并将这些块发送到Dropbox来工作。
这些块必须一个接一个地上升。因此,第一个请求已发送,第二个不能发送,直到第一个请求完成。更不用说不同的块必须到达不同的端点。
为此,我继续在.each()循环中使用syncronus请求,以便该过程在发送下一个块之前将等待。
我的下面的代码。
我的问题是,当发送大文件(150MB +)时,浏览器开始调整,然后该表单就没用了。
我的问题是,我该如何异步发出这些请求,并仍然按正确的顺序上传它们,并且仅在发送了前一个块之后才发送一个块。
knpv_chunked_upload(chunks){
var dropbox = this;
//Send each chunk to Dropbox
jQuery(dropbox.chunks).each(function(index, chunk){
//This request is for the first chunk
if (index == 0) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/start', false);
xhr.setRequestHeader('Authorization', 'Bearer access_key');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({close:false}));
}
//This request is for the middle chunks
if (index >= 1 && index < dropbox.chunks.length - 1) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/append_v2', false);
xhr.setRequestHeader('Authorization', 'Bearer access_key');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
'close':false,
'cursor': {
'session_id': dropbox.session_id,
'offset': dropbox.knpv_offset(index)
}
})
);
}
//This request is for the last chunk
if (index == dropbox.chunks.length - 1) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/finish', false);
xhr.setRequestHeader('Authorization', 'Bearer access_key');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
'cursor': {
'session_id': dropbox.session_id,
'offset': dropbox.knpv_offset(index)
},
'commit': {
'path': dropbox.folderpath+'/'+chunk.name,
'mode': 'overwrite'
}
})
);
}
//Send the chunk
xhr.send(chunk);
})
}