現在のアプローチにはいくつかの問題があります。
FileWriter
APIは必要ありません。これはHTML5 Filesystem APIなしでは使用できません。必要なのはBlobBuilder
File API: Writer specの API です。
第二に、FileReader
読み取りメソッドは非同期であるため、実行しているように結果を渡すことはできませんdoSomething()
。また、ファイルごとに個別のリーダー オブジェクトを作成する必要があります。
ファイルを として読み取り、ArrayBuffer
JS 型付き配列 ( Uint8Array
) を介してそのバイトを操作し、そのバッファから Blob を作成し、結果をサーバーに送信することができます。このようなものがうまくいくかもしれません(テストされていません):
$(function() {
$("#files").change(function(e) {
var files = e.target.files;
[].forEach.call(files, function(f, i) {
var reader = new FileReader();
reader.onload = function(e) {
doSomething(this.result);
};
reader.readAsArrayBuffer(f);
});
return true;
});
});
var doSomething = function(arrayBuffer) {
// Create a unsigned 8-bit view from the underlying data buffer.
var ui8a = new Uint8Array(arrayBuffer);
for (var i = 0; i < ui8a.length; ++i) {
// Manipulate each byte. Its underlying arraybuffer will be changed.
// ui8a[i] = xxx // set byte at offset i to something.
}
var bb = new WebKitBlobBuilder(); // Build a blob from the arraybuffer data.
bb.append(ui8a.buffer);
upload(bb.getBlob('your/filemimetype'));
};
var upload = function(blob) {
var xhr = new XMLHttpRequest();
xhr.open('POST', '/server', true);
xhr.onload = function(e) { ... };
xhr.send(blob);
};
に渡される mimetype が必要かどうかはわかりませんが、bb.getBlob()
それは作業中のファイルのコンテンツ タイプになります。それを試してみてください。