かなり新しい技術であるを使用しているので、新しい技術を使っFormData
たものも紹介します。
まず、FileReader
オブジェクトを含むファイルを読み取ります。
var fr = new FileReader(), buf, file = $('#fileUpload')[0].files[0];
fr.onload = function(e) {
buf = new Uint8Array(e.target.result);
};
fr.readAsArrayBuffer(file);
Blob
次に、分割された部分ごとにを作成できます(1e6
それぞれの長さはバイト)。
for (var i = 0, blobs = []; i < buf.length; i += 1e6)
blobs.push(new Blob([buf.subarray(i, i + 1e6)]));
Blob
最後に、すべてのをFormData
オブジェクトに追加できます。
var formData = new FormData();
for (var i = 0; i < blobs.length; i++)
formData.append("slice" + i, blobs[i], file.name + ".part" + i);
あなたは大丈夫なはずです。しかし、私はそれをテストしていません。
パフォーマンスについても何も知りません。あなたも使うことができるので、文字列fr.readAsBinaryString
を作ることができe.target.result
ます。このように、Blob
単純な// / whateverを使用してsをsubstring
作成slice
できsubstr
ますが、Unicode文字などに問題がある可能性があると思います。さらに、おそらくそれは遅いです。
すべてをより一貫性のあるスニペットに入れる:
$('#fileUpload').change(function() {
// If no file is selected, there's nothing to do
if (!this.files.length) return;
var fr = new FileReader(), file = this.files[0];
fr.onload = function(e) {
splitAndSendFile(new Uint8Array(e.target.result), file);
};
fr.readAsArrayBuffer(file);
};
function splitAndSendFile(dataArray, file) {
var i = 0, formData, blob;
for (; i < dataArray.length; i += 1e6) {
blob = new Blob([dataArray.subarray(i, i + 1e6)]);
formData = new FormData();
formData.append("fileUpload", blob, file.name + ".part" + (i / 1e6));
$.ajax({
url: 'script.php',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(msg){
alert("Win: " + msg);
},
error: function(bla, msg){
alert("Fail: " + msg);
}
});
}
}
注: 3番目のオプションのパラメーターを取ります。これは、またはFormData.append
の場合はファイルの名前である必要があります。指定しない場合、sは予測できないランダムなファイル名を取得する可能性があります。File
Blob
Blob
おそらく、そのパラメーターは標準ではなく、MDN記事には記載されていませんが、それでも上記のスニペットで使用しました。とにかく、自分が何をしているのかがわかっている場合は、ファイル名を指定するためのいくつかのオプションがあります。たとえばformData.append("filename", file.name)
、リクエストでカスタムヘッダーを使用または送信します。