Javascript 读取多个文件内容';s反应JS
我试图用React.js读取多个文件,但我的代码只读取一个文件,不读取其余文件。有什么建议吗 谢谢Javascript 读取多个文件内容';s反应JS,javascript,reactjs,file,Javascript,Reactjs,File,我试图用React.js读取多个文件,但我的代码只读取一个文件,不读取其余文件。有什么建议吗 谢谢 constructor(props) { super(props); this.state = { files: [], changedFileIndex: -1, fileReader : null }; this.fileUploaderRef = React.createRef(); } handleFile
constructor(props) {
super(props);
this.state = {
files: [],
changedFileIndex: -1,
fileReader : null
};
this.fileUploaderRef = React.createRef();
}
handleFileReader = (e)=>{
console.log("handleFileReader")
var content =this.state.fileReader.result;
console.log(content);
}
handleFileChosen(file){
console.log("handleFileChosen")
console.log(file.result)
this.state.fileReader=new FileReader();
this.state.fileReader.onloadend = this.handleFileReader;
this.state.fileReader.readAsText(file);
}
async readAllFiles (AllFiles) {
console.log("readAllFiles")
//console.log(AllFiles[0].name)
AllFiles.map((file)=>
{
this.handleFileChosen(file)
}
);
}
在文件数组中,我们需要循环文件并发送到其他函数,以便在数组中写入每个文件的内容。
在一些调试之后,例如对于2个文件,代码似乎执行了“HandleFileSelected”2次,然后转到handleFileReader 2次,这可能是错误的,但我不确定如何修复此问题。相反,它应该是这样的:执行'HandleFileReader',然后执行'HandleFileSelected',然后再次执行'HandleFileReader',然后执行'HandleFileSelected'arr.map()
是同步的,FileReader是异步的,使用Promise.all
在map返回的数组上
参考:
我已修改您的函数以读取所有文件
handleFileChosen = async (file) => {
return new Promise((resolve, reject) => {
let fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.onerror = reject;
fileReader.readAsText(file);
});
}
readAllFiles = async (AllFiles) => {
const results = await Promise.all(AllFiles.map(async (file) => {
const fileContents = await handleFileChosen(file);
return fileContents;
}));
console.log(results);
return results;
}
arr.map()
是同步的
文件阅读器异步工作,使用Promise.map返回的数组上的所有
参考:
我已修改您的函数以读取所有文件
handleFileChosen = async (file) => {
return new Promise((resolve, reject) => {
let fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.onerror = reject;
fileReader.readAsText(file);
});
}
readAllFiles = async (AllFiles) => {
const results = await Promise.all(AllFiles.map(async (file) => {
const fileContents = await handleFileChosen(file);
return fileContents;
}));
console.log(results);
return results;
}
请查找显示如何读取多个文件内容的完整代码。在
handleUpload
事件中,我准备了AllFiles
并通过传递AllFiles
调用函数readAllFiles
。然后我在实际读取文件内容的readAllFiles
下调用了readFileContents
。由于FileReader异步工作,因此需要在此处使用Promise
代码如下:
import React, {Component} from 'react';
export default class FileReaderExample extends Component {
readFileContents = async (file) => {
return new Promise((resolve, reject) => {
let fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.onerror = reject;
fileReader.readAsText(file);
});
}
readAllFiles = async (AllFiles) => {
const results = await Promise.all(AllFiles.map(async (file) => {
const fileContents = await this.readFileContents(file);
return fileContents;
}));
console.log(results, 'resutls');
return results;
}
handleUpload = (e) => {
let AllFiles = [];
[...e.target.files].map(file => AllFiles.push(file));
this.readAllFiles(AllFiles).then(result => {
let preview = document.getElementById('showText');
let allFileContents = "";
result.map(res =>{
allFileContents += res + '<br/>'
})
preview.innerHTML = allFileContents;
})
.catch(err => {
alert(err);
});
}
render = () => {
return (<div>
<input type="file" multiple onChange={(e) => this.handleUpload(e)}/>
<div id="showText">Choose text File</div>
</div>
)
}
}
import React,{Component}来自'React';
导出默认类FileReaderExample扩展组件{
readFileContents=异步(文件)=>{
返回新承诺((解决、拒绝)=>{
让fileReader=newFileReader();
fileReader.onload=()=>{
解析(fileReader.result);
};
fileReader.onerror=拒绝;
readAsText(文件);
});
}
readAllFiles=async(所有文件)=>{
const results=wait Promise.all(AllFiles.map)(异步(文件)=>{
const fileContents=wait this.readFileContents(文件);
返回文件内容;
}));
日志(结果“resultls”);
返回结果;
}
handleUpload=(e)=>{
让所有文件=[];
[…e.target.files].map(文件=>AllFiles.push(文件));
这个.readAllFiles(AllFiles).then(result=>{
让preview=document.getElementById('showText');
让allFileContents=“”;
result.map(res=>{
allFileContents+=res+'
'
})
preview.innerHTML=所有文件内容;
})
.catch(错误=>{
警惕(err);
});
}
渲染=()=>{
返回(
this.handleUpload(e)}/>
选择文本文件
)
}
}
请查找完整的代码,以显示如何读取多个文件内容。在handleUpload
事件中,我准备了AllFiles
并通过传递AllFiles
调用函数readAllFiles
。然后我在实际读取文件内容的readAllFiles
下调用了readFileContents
。由于FileReader异步工作,因此需要在此处使用Promise
代码如下:
import React, {Component} from 'react';
export default class FileReaderExample extends Component {
readFileContents = async (file) => {
return new Promise((resolve, reject) => {
let fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.onerror = reject;
fileReader.readAsText(file);
});
}
readAllFiles = async (AllFiles) => {
const results = await Promise.all(AllFiles.map(async (file) => {
const fileContents = await this.readFileContents(file);
return fileContents;
}));
console.log(results, 'resutls');
return results;
}
handleUpload = (e) => {
let AllFiles = [];
[...e.target.files].map(file => AllFiles.push(file));
this.readAllFiles(AllFiles).then(result => {
let preview = document.getElementById('showText');
let allFileContents = "";
result.map(res =>{
allFileContents += res + '<br/>'
})
preview.innerHTML = allFileContents;
})
.catch(err => {
alert(err);
});
}
render = () => {
return (<div>
<input type="file" multiple onChange={(e) => this.handleUpload(e)}/>
<div id="showText">Choose text File</div>
</div>
)
}
}
import React,{Component}来自'React';
导出默认类FileReaderExample扩展组件{
readFileContents=异步(文件)=>{
返回新承诺((解决、拒绝)=>{
让fileReader=newFileReader();
fileReader.onload=()=>{
解析(fileReader.result);
};
fileReader.onerror=拒绝;
readAsText(文件);
});
}
readAllFiles=async(所有文件)=>{
const results=wait Promise.all(AllFiles.map)(异步(文件)=>{
const fileContents=wait this.readFileContents(文件);
返回文件内容;
}));
日志(结果“resultls”);
返回结果;
}
handleUpload=(e)=>{
让所有文件=[];
[…e.target.files].map(文件=>AllFiles.push(文件));
这个.readAllFiles(AllFiles).then(result=>{
让preview=document.getElementById('showText');
让allFileContents=“”;
result.map(res=>{
allFileContents+=res+'
'
})
preview.innerHTML=所有文件内容;
})
.catch(错误=>{
警惕(err);
});
}
渲染=()=>{
返回(
this.handleUpload(e)}/>
选择文本文件
)
}
}