如何处理FileReader在TypeScript中返回ArrayBuffer或String

时间:2019-03-14 19:00:00

标签: angular typescript

我已经围成一圈追赶自己了,现在是时候寻求帮助了。我有以下(Typescript)服务可打开文件读取器,并根据文件类型调用readAsText()或readAsArrayBuffer()。我有一个包装类(MyDocument),用于fileReader返回的文本以及有关该文档的一些元数据。在MyDocument类中,我定义了一个名为docContent:string的字段。这是麻烦开始的地方。由于条件if语句(用粗体显示)选择了readAsText或readAsArray缓冲区,因此编译器不喜欢将fileReader结果分配给docConent,因为它可以是字符串或ArrayBuffer。所以我将字段修改为: docContent:字符串| ArrayBuffer认为我有多聪明。但是现在该字段可以是字符串,也可以是ArrayBuffer,编译器不会让我操作docContents字段(就像split('\ n'),因为split不属于ArrayBuffer。我知道必须有一个更优雅的解决该问题的方法,但是我离它太近了以至于看不清。不胜感激。

    public readFile(files: FileList): MyDocument {
    this.myDocument = new MyDocument();

    if (files && files[0] && files[0].size > 0) {
        this.fileToRead = files[0];
        this.myDocument.fileName = this.fileToRead.name;
        this.myDocument.fileSize = this.fileToRead.size;
        this.myDocument.fileType = this.fileToRead.type;
    }
    else {
        const message = "Either no file selected, or file has zero size";
        confirm(message);

    }


    if (this.fileToRead) {
        var fr = new FileReader();

        fr.onloadend = () => {
            if (this.myDocument.fileType == "text/plain") {
                this.myDocument.docContents = fr.result;
            } else {
                let extractedText = this.extractTextUsingSolr(fr.result);
            }

        }

        ***if (this.fileToRead.type == 'text/plain') {
            fr.readAsText(this.fileToRead);
        }
        else {
            fr.readAsArrayBuffer(this.fileToRead);
        }***

        return this.myDocument;
    }
    else {
        console.log('No file selected!');
        return;
    }

}

仅此而已,这是MyDocument类,当我尝试执行docContents.split(“ \ n”)时,编译器会抱怨该地方。

export class MyDocument {
fileName: string;
fileType: string;
fileSize: number;

numWords: number;
numSents: number;
docWords: string[]; 
docContents: string | ArrayBuffer;

processDocument(): void {
    const sents = [];
    const lines = this.docContents.split("\n");
    let sentWords = [];
    }
}

1 个答案:

答案 0 :(得分:1)

快速修复

if (typeof this.docContents === 'string') {
   lines = this.docContents.split("\n");
} else {
  // dealing with ArrayBuffer
  // google on methods in ArrayBuffer object you can use
}

但是我个人不喜欢这种方法。我将使用2个具有不同名称的不同属性。一个用于ArrayBuffer,另一个用于文本字符串。