0

phonegap の fileTransfer() API を使用して、post を使用してリモート サーバーにいくつかの画像をアップロードしています。画像の数が少ない場合、すべてのファイルのアップロードが完了するのを待たずに開始することで、すべてが正常に機能します。しかし、200 個の画像 (それぞれ約 500Kb) があると、メモリ不足エラーが発生します。とにかく、Apache で同時に処理される非常に多くのアップロードを避けたいと考えています。画像を次々にアップロードするか、同時にアップロードを開始できる数を制限する方法はありますか?

4

1 に答える 1

1

私のアイデアがうまくいくかどうかは 100% 確信が持てませんが、技術的にはうまくいくはずです。同時に送信するファイルの数を分けたい場合は、次のようにします。呼び出しが非同期かどうかはわかりませんが、非同期である可能性が高いですが、実際には問題ではありません。それらを使用していない場合は、Q ライブラリをプロジェクトに追加するか、jQuery の約束を使用して同じことを達成する必要があります。まず、呼び出しをプロミスでラップします。もちろん、呼び出しには、送信しているデータを受信する関数が必要です。このようなもの:

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 に答える