Javascript 从FileReader()返回字节数组
我需要一些帮助,从下面这个函数返回“bytes”变量,作为另一个函数的输入Javascript 从FileReader()返回字节数组,javascript,filereader,Javascript,Filereader,我需要一些帮助,从下面这个函数返回“bytes”变量,作为另一个函数的输入 function openfile() { var input = document.getElementById("files").files; var fileData = new Blob([input[0]]); var reader = new FileReader(); reader.readAsArrayBuffer(fileData); reader.onload = function(){ v
function openfile() {
var input = document.getElementById("files").files;
var fileData = new Blob([input[0]]);
var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function(){
var arrayBuffer = reader.result
var bytes = new Uint8Array(arrayBuffer);
console.log(bytes);
}
我希望获得上述函数的返回值,并在另一个函数中使用字节数组作为输入参数。您可以使用承诺等待文件读取器完成文件加载
function openfile() {
var input = document.getElementById("files").files;
var fileData = new Blob([input[0]]);
var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function(){
var arrayBuffer = reader.result
var bytes = new Uint8Array(arrayBuffer);
console.log(bytes);
}
Promise对象用于延迟和异步计算。承诺表示尚未完成的操作,但预计将在将来完成
你可以找到更多关于承诺的信息
下面是一个例子,说明如何将承诺融入到您的情况中
(功能(文档){
var input=document.getElementById(“文件”),
output=document.getElementById('output');
//用于文件输入的Eventhandler。
函数openfile(evt){
var files=input.files;
//将文件传递给blob,而不是输入[0]。
fileData=newblob([files[0]]);
//将getBuffer传递给promise。
var promise=newpromise(getBuffer(fileData));
//等待承诺得到解决,或记录错误。
promise.then(函数(数据){
//在这里,您可以将字节传递给另一个函数。
output.innerHTML=data.toString();
控制台日志(数据);
}).catch(函数(err){
log('Error:',err);
});
}
/*
创建一个将传递给promise的函数
并在FileReader加载完文件后解决此问题。
*/
函数getBuffer(文件数据){
返回函数(解析){
var reader=new FileReader();
reader.readAsArrayBuffer(文件数据);
reader.onload=函数(){
var arrayBuffer=reader.result
var字节=新的Uint8Array(arrayBuffer);
解析(字节);
}
}
}
//用于文件输入的Eventlistener。
input.addEventListener('change',openfile,false);
}(文件)代码>
如果将onload
函数传递给事件,则可以使其工作
reader.onload = function(e){
var arrayBuffer = e.target.result;
var bytes = new Uint8Array(arrayBuffer);
console.log(bytes);
}
这将其从reader.result
更正为e.target.result代码>
此外,在使用fileData
时存在问题,该数据被设置为Blob[files[0]]
并将其发送到阅读器。readAsArrayBuffer
。删除fileData
并使用reader.readAsArrayBuffer(输入[0])调用它改为code>。返回字节怎么样代码>?要将其用作另一个函数的参数,请如下使用:myfunction(openfile(evt))代码>如果从“console.log(bytes);”更改为“return bytes;”并在“console.log(openfile());”外部调用,则会得到“undefined”,这与我所寻找的不完全一样。但我想我会改变我计划的方式。谢谢。请注意,IE直到版本11才支持Promise对象。看起来不错,但对我来说不起作用。行变量字节=新的Uint8Array(arrayBuffer);出现错误TS2345:“string | ArrayBuffer”类型的参数不能分配给“ArrayBuffer | SharedArrayBuffer | ArrayLike”类型的参数。@mli您好,请问您使用的是TypeScript吗?如果是这样,你确定你正确地铸造了你的类型吗?@DavidDomain。是的,是打字稿。所以我不得不这样说:const bytes=newuint8array(reader.result为ArrayBuffer);无论如何,谢谢你,我只是个新手,所以我认为javascript和typescript没有区别。e.target没有结果属性。@KingWilder如果你使用IE,你可能需要e.srcElement
。如果你用的是Chrome,它就在那里。但是也有一些可能使它无法工作的东西,OP基本上使用的是reader.readAsArrayBuffer(新Blob([input[0]])代码>当它应该是reader.readAsArrayBuffer(document.getElementById(“文件”).files[0])代码>,它最初没有在这里得到地址,并且将改变e
的内容。我在编辑中添加了它。