我在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");
},
在这里被称为
<input ref="file" type="file" name="file"
className="upload-file"
id="file"
onChange={this.handleChangeImage}
encType="multipart/form-data"
required/>
我试图让base64字符串通过AJAX发送到运行Flask的服务器。 问题是每次我选择一个文件时,它都会在控制台
中记录为 null有趣的是,如果我第二次尝试选择文件,它现在会记录整个字符串。我一定错过了一些简单的事情......
答案 0 :(得分:7)
它在控制台中记录为null,因为在打印时状态尚未更改。当您第二次选择文件时,登录控制台的字符串实际上属于您选择的上一个文件。状态尚未更改为您选择的第二个文件。
参考React's doc:
setState()不会立即改变this.state但会创建一个 待定状态转换。调用后访问this.state 方法可以返回现有值。没有 保证调用setState和调用的同步操作 为获得业绩增长而受到批评。
如果要打印正确的状态,可以将其记录在回调函数中:
self.setState({
image: upload.target.result
}, function() {
console.log(self.state.image);
});
这也可以在1s延迟后改变状态:
reader.onload = function(upload) {
self.setState({
image: upload.target.result
});
};
reader.readAsDataURL(file);
setTimeout(function() {
console.log(self.state.image);
}, 1000);
答案 1 :(得分:0)
尝试这个
输入字段
<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"
/>
从计算机读取文件
handleFileRead = async (event) => {
const file = event.target.files[0]
const base64 = await this.convertBase64(file)
console.log(base64)
}
Base64 Converter函数
convertBase64 = (file) => {
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.readAsDataURL(file)
fileReader.onload = () => {
resolve(fileReader.result);
}
fileReader.onerror = (error) => {
reject(error);
}
})
}