0

我正在使用 phonegap 的 fileTransfer() API 使用 post 将一些图像上传到远程服务器。当图像数量较少时,一切正常,通过启动所有文件的上传而不等待它们完成。但是当我说 200 张图片(每张大约 500Kb)时,我遇到了内存不足的错误,无论如何我想避免 apache 同时处理这么多的上传。有没有办法一个接一个地上传图片或限制它可以同时上传的数量?

4

1 回答 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 回答