次の方法で、マルチパートPOSTリクエストを介してバイナリファイルを送信しています。
var xhr = new XMLHttpRequest();
body = '--' + boundary + '\r\n'
+ 'Content-Disposition: form-data; name="file"; '
+ 'filename="temp.bin"\r\n'
+ 'Content-type: application/octet-stream\r\n\r\n'
+ encryptedFileContent + '\r\n'
+ '--' + boundary + '--';
xhr.open("POST", "http://localhost:999/some/path", true);
xhr.setRequestHeader("Content-type", "multipart/form-data; boundary="+boundary);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200)
console.log("File uploaded!");
}
xhr.send(body);
Chromeパッケージのアプリ内で送信していますが、この方法でファイルを送信する理由は、最初にファイルがローカルファイルシステムからを介して読み取られFileReader
、次に暗号化されてから送信されるためです。encryptedFileContent
次の方法で構築されます。
var reader = new FileReader();
reader.onload = function(e) {
var plainArray = Array.apply([], new Int8Array(e.target.result));
var encryptedArray = encrypt(plainArray);
var encryptedFileContent="";
for (var i=0; i<encryptedArray.length; i++) {
encryptedFileContent+=String.fromCharCode(encryptedArray[i])
}
}
reader.readAsArrayBuffer(file);
デバッグすると、encryptedArray
には次の値が含まれていることがわかります。
[ 70, -21, -15, ... ]
サーバー側では、配列が読み取られると、同じデータが表示されると予想されますが、代わりに次のように表示されます。
[ -17, -66, -112, ... ]
バイナリファイルのペイロードを作成する方法が正しくないようです。String.fromCharCode
問題はありますか?
サーバーで受信したバイト配列が異なる理由は、ペイロードがUnicodeに変換され、utf-8にエンコードされるためです。変換せずにデータを送信するには、次に説明するように、データをバイナリとして送信する必要があります。
if (!XMLHttpRequest.prototype.sendAsBinary) {
XMLHttpRequest.prototype.sendAsBinary = function(sData) {
var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
for (var nIdx = 0; nIdx < nBytes; nIdx++) {
ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
}
/* send as ArrayBufferView...: */
this.send(ui8Data);
/* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
};
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加