このページでは http://www.html5rocks.com/en/tutorials/file/dndfiles/ 「例:ファイルをスライスします。試してみてください!」の例までスクロールダウンした場合ローカルファイルのバイトを読み取るためのreadAsBinaryStringAPIの使用が表示されます。
私はIE(私の場合はIE11)がreadAsBinaryStringをサポートしていない)を見てきました。
ポスト HTML5ファイルAPIはテキストとバイナリとして読み取られる で言及されたこのコードでさえ、IE11のreadAsBinaryStringで中断します。
スタックオーバーフローの投稿を見てきましたが、ReadAsArrayBuffer()の使用を推奨しています。しかし、それも機能していません。未定義を返します。
私の質問は、IE11で実行する必要がある場合のオプションは何ですか? readAsBinaryString()のJOBを実行する別のIE互換性のあるJS関数を記述することは可能ですか?.
これが私の解決策です。
var reader = new FileReader();
reader.readAsBinaryString(fileData);
reader.onload = function(e) {
if (reader.result) reader.content = reader.result;
var base64Data = btoa(reader.content);
//...
}
//extend FileReader
if (!FileReader.prototype.readAsBinaryString) {
FileReader.prototype.readAsBinaryString = function (fileData) {
var binary = "";
var pt = this;
var reader = new FileReader();
reader.onload = function (e) {
var bytes = new Uint8Array(reader.result);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]);
}
//pt.result - readonly so assign binary
pt.content = binary;
$(pt).trigger('onload');
}
reader.readAsArrayBuffer(fileData);
}
}
@Jackの回答とコメントを組み合わせて、完全な実例を示します。
<head>
セクションでは、IE11でFileReader.readAsBinaryString
関数を追加するためにこのスクリプトを追加しました
if (FileReader.prototype.readAsBinaryString === undefined) {
FileReader.prototype.readAsBinaryString = function (fileData) {
var binary = "";
var pt = this;
var reader = new FileReader();
reader.onload = function (e) {
var bytes = new Uint8Array(reader.result);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]);
}
//pt.result - readonly so assign content to another property
pt.content = binary;
pt.onload(); // thanks to @Denis comment
}
reader.readAsArrayBuffer(fileData);
}
}
このフォールバック関数を使用する場合、target.result
には値がないため、元のスクリプトコードをわずかに変更する必要がありました。
var reader = new FileReader();
reader.onload = function (e) {
// ADDED CODE
if (!e) {
var data = reader.content;
}
else {
var data = e.target.result;
}
// business code
};
reader.readAsBinaryString(myFile);
IE 11の場合、このXHRトリックを使用できます。
function blobToBinaryStringIE11(blob) {
var blobURL = URL.createObjectURL(blob);
var xhr = new XMLHttpRequest;
xhr.open("get", blobURL);
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.onload = function () {
var binary = xhr.response;
// do stuff
};
xhr.send();
}
Uint8Array + fromCharCode
ルートより20倍高速で、readAsBinaryString
と同じ速さです。
FileReader.readAsBinaryString
は非標準の関数であり、廃止されました。
代わりにFileReader.readAsArrayBuffer
を使用する必要があります。
交換
reader.readAsBinaryString(blob);
で:
reader.readAsText(blob);
クロスブラウザでうまく機能します。