我正在使用 phonegap 的 fileTransfer() API 使用 post 将一些图像上传到远程服务器。当图像数量较少时,一切正常,通过启动所有文件的上传而不等待它们完成。但是当我说 200 张图片(每张大约 500Kb)时,我遇到了内存不足的错误,无论如何我想避免 apache 同时处理这么多的上传。有没有办法一个接一个地上传图片或限制它可以同时上传的数量?
问问题
808 次
1 回答
1
好吧,我不是 100% 确定我的想法会奏效,但从技术上讲它应该会奏效。如果要分开同时发送的文件数,可以执行以下操作:我不知道您的调用是否是异步的,尽管它们很可能是异步的,但这并不重要。如果您不使用它们,您应该将 Q 库添加到您的项目中,或者使用 jQuery 的 Promise 实现相同的目标。首先,你将你的电话包装在一个承诺中。当然,你的调用应该有一个函数来接收它发送的数据。像这样的东西:
我以 apache 的文档为例
function uploadYourFiles(files) {
var deffered = Q.Deffer();
uploadFiles(files);
function uploadFiles(files) {
//the logic you use to upload you files
//the win and error are the callback functions you get on the upload method
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
deffered.resolve(r);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
console.log("upload error source " + error.source);
console.log("upload error target " + error.target);
deffered.reject(error);
}
return deffered.promise;
}
请注意,整个逻辑都包含在一个 Promise 中。
现在您已经对整个操作做出了承诺,您可以使用下一部分数据让这个承诺自行调用,这样您就可以确保您正在分段发送文件并确定这些文件的顺序件,因为当前 N 个文件已经发送时,您将发送接下来的 N 个文件。
要提示它在您的代码中的外观:
var from = 0;
var to = 10;
function uploadTheFiles() {
var currentBatch = getFiles(from, to); //this function should return you the files from 0 to 10 for an instance
uploadYourFiles(currentBatch).then(function () {
from = to + 1;
to += 10; //or however you want; You can insert some logic here to make sure to wont brake something by becoming bigger than your collection's length
//this should serve as the end of the infinite recursion
//files here is the array that contains your files.
//if you have their count or whatever, you can use it.
if (from < files.length) {
uploadTheFiles();
}
});
}
希望有帮助。如果唯一的原因是你没有足够的内存使用承诺,你可以逐个上传工作,至少按照我的逻辑,这不应该导致内存不足,只要你发送的间隔不是当然太大了。
于 2014-03-06T14:20:08.720 回答