javascript - 如何清除 FileReader() 缓冲区的内容?

标签 javascript reactjs filereader

我有一个带有 onChange 函数的 HTML 文件 uploader ,它可以找到我上传的文件的 SHA256 哈希值。我的问题是,如果我选择一个新文件,它似乎是在“构建”缓冲区的内容(因此返回每个上传文件的错误散列,第一个文件除外)。这是正在发生的事情的一个例子。每个文件按顺序选择:

one.txt returns 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b (correct)
two.txt returns 1e5e6cdb24208b723fa1631b107613cb1084c202a3b48fc6e3ddf9d458adf5ea
one.txt returns 2ebc9be2494f13b2ec93f578bea1002be847c7fad8a5bf27ddd674547121a284

我曾尝试将缓冲区放入一个状态,并使用该状态来查找散列。希望每次重新加载 DOM(通过调用 onChange() 函数)时,我都会得到一个新的缓冲区。要么我做错了,要么它不起作用。这是完整的代码,有什么想法吗?

import React, { Component } from "react";

const crypto = require("crypto");
const hash = crypto.createHash("sha256");

class SearchPage extends Component {
  constructor(props) {
    super(props);
    this.state = {
      hashOutput: "",
      files: null,
    };
  }

  onChange(e) {
    let files = e.target.files;
    let reader = new FileReader();
    this.setState({ fileName: files[0].name });
    this.setState({ files: files[0] }, () => {
      reader.readAsArrayBuffer(this.state.files);
    });
    console.log(this.state.files);

    reader.onload = e => {
      hash.update(Buffer.from(e.target.result));
      const hashOutput = hash.digest("hex");
      this.setState({ hashOutput });
      console.log(hashOutput);
    };
  }

  render() {
    return (
        <div onSubmit={this.onFormSubmit}>
          <input type="file" name="file" onChange={e => this.onChange(e)} />
        </div>
    );
  }
}

最佳答案

从顶部删除 const 散列并尝试如下操作:

onChange(e, hash) {
let files = e.target.files;
let reader = new FileReader();
this.setState({ fileName: files[0].name });
this.setState({ files: files[0] }, () => {
  reader.readAsArrayBuffer(this.state.files);
});
console.log(this.state.files);

reader.onload = e => {
  hash.update(Buffer.from(e.target.result));
  const hashOutput = hash.digest("hex");
  this.setState({ hashOutput });
  console.log(hashOutput);
  };
}

render() {
return (
    <div onSubmit={this.onFormSubmit}>
      <input type="file" name="file" onChange={e => 
      this.onChange(e, 
      crypto.createHash("sha256"))} />
    </div>
    );
   }
  } 

关于javascript - 如何清除 FileReader() 缓冲区的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54603209/

相关文章:

javascript - react 钩子(Hook)。将值作为参数传递给 useReducer()

javascript - 在 React.js 中计算选中的复选框

javascript - innerText 在 Jest 测试中未定义

javascript - reader.onload 关闭不触发

javascript - 使用唯一 id 动态附加 html 并使用 Jquery 删除正确的 html

javascript - 如何在 React 中应用外部 SetState

javascript - 隐藏使用 Meteor.js 的迹象

java - FileReader 和 FileInputStream 的不同输出

java - 拆分字符串不起作用。 (未使用局部变量的值)

javascript - 如何更改div中的内容而不覆盖当前内容?