Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
E11上的JavaScript readAsBinaryString函数_Javascript_Html_Internet Explorer - Fatal编程技术网

E11上的JavaScript readAsBinaryString函数

E11上的JavaScript readAsBinaryString函数,javascript,html,internet-explorer,Javascript,Html,Internet Explorer,在本页中,如果您向下滚动到示例“示例:切片文件。试试看!”您将看到使用readAsBinaryStringAPI读取本地文件的字节 我看到IE(我的案例是IE11)不支持readAsBinaryString 甚至在IE11中的readAsBinaryString的博文中也提到了这段代码 我在堆栈溢出中看到一些帖子,它建议使用ReadAsArrayBuffer()。但它也不起作用。它返回undefined 我的问题是,如果我必须在IE11上运行它,有哪些选项?是否可以编写另一个与IE兼容的JS函数

在本页中,如果您向下滚动到示例“示例:切片文件。试试看!”您将看到使用readAsBinaryStringAPI读取本地文件的字节

我看到IE(我的案例是IE11)不支持readAsBinaryString

甚至在IE11中的readAsBinaryString的博文中也提到了这段代码

我在堆栈溢出中看到一些帖子,它建议使用ReadAsArrayBuffer()。但它也不起作用。它返回undefined

我的问题是,如果我必须在IE11上运行它,有哪些选项?是否可以编写另一个与IE兼容的JS函数来完成readAsBinaryString()的工作。

这是我的解决方案

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);
    }
}
var reader=newfilereader();
reader.readAsBinaryString(fileData);
reader.onload=函数(e){
如果(reader.result)reader.content=reader.result;
var base64Data=btoa(reader.content);
//...
}
//扩展文件读取器
如果(!FileReader.prototype.readAsBinaryString){
FileReader.prototype.readAsBinaryString=函数(fileData){
var binary=“”;
var pt=此;
var reader=new FileReader();
reader.onload=函数(e){
var bytes=新的Uint8Array(reader.result);
var长度=字节。字节长度;
对于(变量i=0;i
我将@Jack answer与我的评论结合起来,以展示一个完整的工作示例

部分,我添加了这个脚本,以在IE11中添加
文件阅读器.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);
    }
}

对于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
替换一样快

reader.readAsBinaryString(blob);
与:


它在跨浏览器中运行良好。

文件阅读器。readAsBinaryString
是一个非标准函数,已被弃用

应改用
FileReader.readAsArrayBuffer


我对这里的答案有些疑问,最后做了一些小改动

我的解决方案不是分配给pt.content,而是将一个自定义对象发送到原型的onload,接收者可以专门查找,我将这个属性命名为msieContent,因此它将非常具体

此外,我还使用了其他公认的答案,以更稳健的方式将Uint8Array转换为字符串,您可以在此处看到它的全部细节:

聚填料
if(FileReader.prototype.readAsBinaryString==未定义){
// https://stackoverflow.com/a/12713326/213050
函数Uint8ToString(u8a:Uint8Array){
const CHUNK_SZ=0x8000;
设c=[];
for(设i=0;ithis.onload({
msieContent:Uint8ToString(新的Uint8Array(reader.result))
});
reader.readAsArrayBuffer(文件数据);
}
}
用法
private\u handleTextFile(文件:file){
const reader=new FileReader();
reader.onload=(e)=>{
//支持msie,请参阅polyfills.ts
const readResult:string=(e).msieContent | | e.target.result;
};
reader.readAsBinaryString(文件);
}

在主代码中,我使用
FileReader
的方式是:
var reader=newfilereader();reader.onload=function(e){var data=e.target.result;.CODE HERE..};reader.readAsBinaryString(myFile)
。我需要这样更改
reader.onload
reader.onload=function(e){if(!e){var data=reader.content;}否则{var data=e.target.result;}..code HERE..}@Naigel评论对他所写的更改非常有帮助。结合Jacks代码和Naigels为我工作
$(pt.trigger('onload')是jQuery的触发器方法吗?如何在没有jQuery的情况下分派此事件?
$(pt.trigger('onload')是jQuery的触发器方法吗?如何在没有jQuery的情况下发送此事件?Jack+Naigel=刚刚保存了我的day@Denis添加了您的建议,这是唯一需要jQuery的代码行,使用vanilla JS很容易更改。@NachPD很高兴帮助其他人,我已经在这一点上浪费了很多时间,让我们让它们变得有价值;)为什么不总是使用
e.target.result
?是
!e
是否为真?这有问题。因为浏览器认为它的文本不是二进制的,所以可能会导致错误,例如在firefox中,我得到了无效字符错误。
reader.readAsBinaryString(blob);
reader.readAsText(blob);