从FileReader()返回Bytes数组

时间:2015-07-15 14:37:10

标签: 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(){
    var arrayBuffer = reader.result
    var bytes = new Uint8Array(arrayBuffer);
    console.log(bytes);
}

我想返回上面的函数,并在另一个函数中使用字节数组作为输入参数。

2 个答案:

答案 0 :(得分:8)

您可以使用promises等待文件阅读器完成加载文件。

  

Promise 对象用于延迟和异步计算。承诺代表了一项尚未完成但仍将在未来完成的行动。

Here您可以找到有关承诺的更多信息。

以下是一个关于如何将承诺整合到您的情况中的示例。



<%= "#{p.nom}    " %>
&#13;
(function (document) {
  var input = document.getElementById("files"),
      output = document.getElementById('output'),
      fileData; // We need fileData to be visible to getBuffer.

  // Eventhandler for file input. 
  function openfile(evt) {
    var files = input.files;
    // Pass the file to the blob, not the input[0].
    fileData = new Blob([files[0]]);
    // Pass getBuffer to promise.
    var promise = new Promise(getBuffer);
    // Wait for promise to be resolved, or log error.
    promise.then(function(data) {
      // Here you can pass the bytes to another function.
      output.innerHTML = data.toString();
      console.log(data);
    }).catch(function(err) {
      console.log('Error: ',err);
    });
  }

  /* 
    Create a function which will be passed to the promise
    and resolve it when FileReader has finished loading the file.
  */
  function getBuffer(resolve) {
    var reader = new FileReader();
    reader.readAsArrayBuffer(fileData);
    reader.onload = function() {
      var arrayBuffer = reader.result
      var bytes = new Uint8Array(arrayBuffer);
      resolve(bytes);
    }
  }

  // Eventlistener for file input.
  input.addEventListener('change', openfile, false);
}(document));
&#13;
&#13;
&#13;

答案 1 :(得分:2)

如果您通过事件的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]]设置为reader.readAsArrayBuffer并将其发送到fileData。移除reader.readAsArrayBuffer(input[0]);,然后使用{{1}}进行调用。