我尝试将通过输入文件获得的文件转换为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()
我错过了什么?
答案 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;
答案 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);
}