Dev*_*.K. 23 javascript html5 internet-explorer
在此页面 http://www.html5rocks.com/en/tutorials/file/dndfiles/,如果您向下滚动到示例"示例:切片文件.试试吧!" 您将看到使用readAsBinaryString API读取本地文件的字节.
我见过IE(我的情况是IE11)不支持readAsBinaryString.
甚至在HTML5文件API中提到的此代码也会在IE11 中的readAsBinaryString中读取为文本和二进制中断.
我在堆栈溢出中看到了一些帖子,它建议使用ReadAsArrayBuffer().但它也没有用.它返回undefined.
我的问题是如果我必须在IE11上运行它有什么选择?是否可以编写另一个IE兼容的JS函数,它将执行readAsBinaryString()的JOB.
Nai*_*gel 43
我将@Jack答案与我的评论结合起来,以展示一个完整的工作示例.
在本<head>
节中,我添加了此脚本以FileReader.readAsBinaryString
在IE11中添加功能
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要稍微修改我的原始脚本代码,因为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);
Run Code Online (Sandbox Code Playgroud)
小智 31
这是我的解决方案.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
对于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();
}
Run Code Online (Sandbox Code Playgroud)
它比Uint8Array + fromCharCode
路线快20倍,速度快readAsBinaryString
.
归档时间: |
|
查看次数: |
27143 次 |
最近记录: |