【发布时间】:2019-09-24 08:04:51
【问题描述】:
我正在尝试通过输入读取文件夹并将文件夹中包含的每个单独文件的内容保存在数组中。
这一切都是通过这个输入完成的:
<div class="form-group">
<input type="file" id="file" (change)="accessFiles($event)" webkitdirectory directory multiple >
</div>
还有这个 FileReader:
files = []
readFolder(fileChangeEvent: Event) {
this.readFile(0, (fileChangeEvent.target as HTMLInputElement).files);
}
private readFile(index, files) {
const reader = new FileReader();
if (index >= files.length ) {
console.log(this.files);
return;
}
const file = files[index];
reader.onload = (e: any) => {
const bin = e.target.result;
this.files.push(e.target.result);
this.readFile(index + 1, files);
};
reader.readAsBinaryString(file);
}
现在,readFile 中的 console.log 显示数组,它看起来很好,现在唯一的事情是我想稍后在代码中使用它,因为我正试图返回它。
我试过这样的事情:
accessFiles(data){
const contentList = this.readDocument(data));
}
这不起作用。结果是undefined
我也尝试订阅数据:
accessFiles(data){
this.readFolder(data).subscribe(values => {
}
}
但后来我得到了这个错误:
类型“void”上不存在属性“subscribe”。
这就是我尝试实现 Observable 的原因:
files = []
readFolder(fileChangeEvent: Event) {
return this.readFile(0, (fileChangeEvent.target as HTMLInputElement).files);
}
private readFile(index, files) {
return new Observable<any>(obs => {
const reader = new FileReader();
if (index >= files.length ) {
console.log(this.files);
obs.next({result: this.files});
return;
}
const file = files[index];
reader.onload = (e: any) => {
const bin = e.target.result;
this.files.push(e.target.result);
this.readFile(index + 1, files);
};
reader.readAsBinaryString(file);
});
}
但我得到的唯一输出是:
可观察的 {_isScalar: false, _subscribe: ƒ}
我不太确定这意味着什么......
如何从 FileReader 正确访问列表?还是我做错了什么?
【问题讨论】:
-
我认为你让它有点太复杂了。如果我写一个将内容列表存储在服务中的答案,可以吗?这样您就可以从代码中的任何位置访问它。 (我假设您的 readFolder 函数有效)
-
没关系,我在想它有点复杂,但我真的很缺乏经验,所以我不确定是否有更简单的方法
-
我唯一能说它有效的是readFile函数中的console.log,它完美地显示了我想要访问的数组
-
最后你并没有把它弄得过于复杂,你已经非常接近一个可行的解决方案了。
标签: angular observable filereader