ReactJS base64文件上传

edw*_*ffs 5 filereader reactjs

我在React组件上有这个功能

handleChangeImage: function (evt) {
    console.log("Uploading");
    var self = this;
    var reader = new FileReader();
    var file = evt.target.files[0];

    reader.onload = function(upload) {
        self.setState({
            image: upload.target.result
        });
    };
    reader.readAsDataURL(file);
    console.log(this.state.image);
    console.log("Uploaded");
},
Run Code Online (Sandbox Code Playgroud)

并在这里被称为

<input ref="file" type="file" name="file" 
                              className="upload-file" 
                              id="file"
                              onChange={this.handleChangeImage}
                              encType="multipart/form-data" 
                              required/>
Run Code Online (Sandbox Code Playgroud)

我正在尝试将base64字符串通过AJAX发送到运行Flask的服务器.问题是每次我选择一个文件时,它都会在控制台中记录为null

有趣的是,如果我第二次尝试选择文件,它现在记录整个字符串.我一定是想念一些简单的......

Siu*_*Siu 7

它在控制台中记录为null,因为在打印时状态尚未更改.当您第二次选择文件时,登录控制台的字符串实际上属于您选择的上一个文件.状态尚未更改为您选择的第二个文件.

参考React的文档:

setState()不会立即改变this.state,但会创建挂起状态转换.调用此方法后访问this.state可能会返回现有值.无法保证对setState的调用进行同步操作,并且可以对调用进行批处理以获得性能提升.

如果要打印正确的状态,可以将其记录在回调函数中:

self.setState({
    image: upload.target.result
}, function() {
    console.log(self.state.image);
});
Run Code Online (Sandbox Code Playgroud)

这也可以在1s延迟后改变状态:

reader.onload = function(upload) {
    self.setState({
        image: upload.target.result
    });
};
reader.readAsDataURL(file);    
setTimeout(function() {
  console.log(self.state.image);
}, 1000);
Run Code Online (Sandbox Code Playgroud)

  • @isaksham要显示图像的预览,可以添加以下元素:`<img rel="nofollow noreferrer" src = {this.state.image} />`,其中`image`是文件的数据,作为base64编码的字符串.每当通过`FileReader.readAsDataURL()`选择并读取新的图像文件时,状态将改变,从而更新`<img rel="nofollow noreferrer" />`源. (2认同)

小智 6

试试这个

输入栏

              <MyTextField
                id="originalFileName"
                type="file"
                inputProps={{ accept: 'image/*, .xlsx, .xls, .csv, .pdf, .pptx, .pptm, .ppt' }}
                required
                label="Document"
                name="originalFileName"
                onChange={e => this.handleFileRead(e)}
                size="small"
                variant="standard"
              />
Run Code Online (Sandbox Code Playgroud)

从计算机读取文件

  handleFileRead = async (event) => {
    const file = event.target.files[0]
    const base64 = await this.convertBase64(file)
    console.log(base64)
  }
Run Code Online (Sandbox Code Playgroud)

Base64 转换器功能

  convertBase64 = (file) => {
    return new Promise((resolve, reject) => {
      const fileReader = new FileReader();
      fileReader.readAsDataURL(file)
      fileReader.onload = () => {
        resolve(fileReader.result);
      }
      fileReader.onerror = (error) => {
        reject(error);
      }
    })
  }
Run Code Online (Sandbox Code Playgroud)