phonegap の fileTransfer() API を使用して、post を使用してリモート サーバーにいくつかの画像をアップロードしています。画像の数が少ない場合、すべてのファイルのアップロードが完了するのを待たずに開始することで、すべてが正常に機能します。しかし、200 個の画像 (それぞれ約 500Kb) があると、メモリ不足エラーが発生します。とにかく、Apache で同時に処理される非常に多くのアップロードを避けたいと考えています。画像を次々にアップロードするか、同時にアップロードを開始できる数を制限する方法はありますか?
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();
}
});
}
それが役立つことを願っています。唯一の理由が、約束を使用して十分なメモリがないということである場合は、アップロードを少しずつ行うことができます。少なくとも私の論理では、送信する間隔が長くない限り、メモリが不足することはありません。もちろん大きすぎます。