ユーザーが大きなファイルをアップロードできるようにするツールを開発しています(つまり、「サイズは重要ではありません」という意味です)。JavaScriptで実際に「アップロード」を処理するコードの一部を以下に貼り付けました。コード自体は問題なく動作します。約 500 MB のファイルをアップロードしました。15分 つまり、サーバーとしても機能する粗末なコンピューターで。実際のサーバーでは、はるかにうまく機能することを期待しています。
私が求めているのは、パフォーマンスに大きな影響を与える必要のないセキュリティの提案と、パフォーマンスのアップグレードです。私の見方では、サーバーに送信されたデータをエンコード/パックしようとすると、パフォーマンスに大きな影響があります。
もう 1 つの問題は、chunkSize です。ファイルの「スライス」の大きさをプログラマーに選択させました。ただし、制限はサーバーの max_post_size です。デフォルトでは、1024 * 512 バイトに設定されています。
チャンクサイズを大きくすると、アップロードのプロセス全体が高速に動作することに気付きました (無数のテストにより)。理由は明らかです。progress イベントとサーバーとの通信がトリガーされる頻度が低くなります。ただし、プログレス バーの場合、精度が非常に低くなり、アプリケーションがクラッシュしたとユーザーが信じてページを閉じてしまう可能性があります。
だから基本的に私はこれらの2つの質問があります:
1: パフォーマンスに (あまり) 影響を与えずにデータをエンコード/パックする方法
2: ツールの全体的なパフォーマンスを向上させるにはどうすればよいですか?
その間、私は自分でいくつかの研究を行います。
アップロードを処理するコードは次のとおりです。
Uploader.UploadFile = function (file, instance) {
var fr = new FileReader;
chunkSize = instance.settings.chunkSize > window.maxPost ? window.maxPost : instance.settings.chunkSize;
var chunks = Math.ceil(file.size / chunkSize);
var chunk = 0;
var startTime = (new Date()).getTime();
function SendSlice() {
var start, end;
start = chunk * chunkSize;
if (start > file.size) {
start = end + 1;
}
end = start + (chunkSize) >= file.size ? file.size : start + (chunkSize);
status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress");
if (status == 'start') {
if(instance.settings.onStartUpload && instance.settings.onStartUpload.call) {
var event = new Uploader.Event.StartUpload({
time : (new Date()).getTime(),
file : file,
target : instance.element
});
instance.settings.onStartUpload(event);
}
}
fr.onload = function(e) {
var sliceData = e.target.result;
$.ajax({
type : "POST",
url : "uploader.php",
data : {
filename : file.name,
path : instance.settings.path,
status : status,
slice : sliceData
}
}).success(function(data) {
if (++chunk <= chunks) {
if(instance.settings.onProgress && instance.settings.onProgress.call) {
var event = new Uploader.Event.Progress({
time : (new Date()).getTime(),
file : file,
target : instance.element,
pieces: chunks,
currentPiece : chunk,
percent : (chunk / chunks) * 100,
bytesUploaded : end,
bytesRemaining : file.size - end
});
instance.settings.onProgress(event);
}
SendSlice();
} else {
if(instance.settings.onCompleteFile && instance.settings.onCompleteFile.call) {
var time = (new Date()).getTime();
var duration = time - startTime;
var event = new Uploader.Event.FileComplete({
time : time,
file : file,
target : instance.element,
duration : duration
});
instance.settings.onCompleteFile(event);
}
}
});
};
fr.readAsDataURL(file.slice(start, end));
}
SendSlice();
}