将input = file转换为byte数组

时间:2016-05-10 09:29:53

标签: javascript filereader

我尝试将通过输入文件获得的文件转换为byte []。 我尝试使用FileReader,但我必须错过一些东西:

var bytes = [];
var reader = new FileReader();
reader.onload = function () {
   bytes = reader.result;
};
reader.readAsArrayBuffer(myFile);

但最后,我的字节var并不满足字节数组。

我看到这篇文章:Getting byte array through input type = file但它并没有以byte []结尾,并且不推荐使用readAsBinaryString()

我错过了什么?

3 个答案:

答案 0 :(得分:8)

遇到类似的问题,其真正的'reader.result'不会以'byte []'结尾。所以我把它投射到Uint8Array对象。这也不是一个完美的'byte []',所以我不得不从中创建一个'byte []'。这是我解决这个问题的方法,对我来说效果很好。

performLogin

'fileByteArray'正是您要找的。看到评论,似乎你做了同样的事情,仍然想分享方法。

答案 1 :(得分:2)

对我来说,你只是想把文件放到一个数组中?这些函数怎么样 - 你可以把它作为文本读取,另一个作为base64字节字符串,如果你真的想要readAsArrayBuffer数组缓冲区输出,我也包括:



document.getElementById("myBtn").addEventListener("click", function() {
  uploadFile3();
}); 

var fileByteArray = [];

function uploadFile1(){
  var files = myInput.files[0];
  var reader = new FileReader();
  reader.onload = processFile(files);
  reader.readAsText(files); 
}

function uploadFile2(){
  var files = document.querySelector('input').files[0];
  var reader = new FileReader();
  reader.onload = processFile(files);
  reader.readAsDataURL(files); 
}

function uploadFile3(){
  var files = myInput.files[0];
  var reader = new FileReader();
  reader.onload = processFile(files);
  reader.readAsArrayBuffer(files); 
}

function processFile(theFile){
  return function(e) { 
    var theBytes = e.target.result; //.split('base64,')[1]; // use with uploadFile2
    fileByteArray.push(theBytes);
    document.getElementById('file').innerText = '';
    for (var i=0; i<fileByteArray.length; i++) {
        document.getElementById('file').innerText += fileByteArray[i];
    }
  }
}
&#13;
<input id="myInput" type="file">    
<button id="myBtn">Try it</button>
<span id="file"></span>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

这里是经过修改的版本,在我看来,该版本更容易接受。此函数返回一个Promise,其值为byte []。

function fileToByteArray(file) {
    return new Promise((resolve, reject) => {
        try {
            let reader = new FileReader();
            let fileByteArray = [];
            reader.readAsArrayBuffer(file);
            reader.onloadend = (evt) => {
                if (evt.target.readyState == FileReader.DONE) {
                    let arrayBuffer = evt.target.result,
                        array = new Uint8Array(arrayBuffer);
                    for (byte of array) {
                        fileByteArray.push(byte);
                    }
                }
                resolve(fileByteArray);
            }
        }
        catch (e) {
            reject(e);
        } 
    })
}

这样,您可以简单地在这样的异步函数中调用此函数

async function getByteArray() {
    //Get file from your input element
    let myFile = document.getElementById('myFileInput').files[0];

    //Wait for the file to be converted to a byteArray
    let byteArray = await fileToByteArray(myFile);

    //Do something with the byteArray
    console.log(byteArray);
}