“提取”方法是否具有与“文件阅读器”相同的功能?

时间:2019-01-06 13:14:28

标签: javascript fetch filereader

我设法逐字节读取文本文件,并通过input元素和FileReader将最终用户的计算机加载的文件的字符集从Windows-1251更改为Unicode。现在,我想通过fetch对服务器中的文件执行相同的操作。有可能这样做吗? (fetch会位于通过HTTP服务的页面中,而URL则是相对的,例如fetch("raw/graph_tab.txt")。我并不是像使用{一样尝试直接从最终用户的计算机中读取文件。 {1}}字段和input)。

大量工作代码('windows-1251.js'库由Mathias Bynens创建):

FileReader

2 个答案:

答案 0 :(得分:2)

如果您要使用encoding方法的FileReader.readAsText(Blob, encoding)参数,则可以在响应的Content-Type标头中设置charset parameter。 / p>

如果由于某种原因无法执行此操作,则必须使用Response方法将Body.blob()对象消耗到Blob,然后将生成的 Blob 到FileReader。

否则,即使 Response 对象具有与 FileReader 类似的方法,text()方法也不提供编码选项...

答案 1 :(得分:1)

您完全不需要进行此转换:您正在运行Web服务器,这显然不能正确识别文件的编码。它应该在返回的Content-Type标头中正确标识它(例如:Content-Type: text/plain; charset=windows-1251)。有关更多信息,请参见SO自己的Joel Spolsky的this article

如果由于某些原因而无法执行此操作:您可以将文件读取为二进制文件,并在ArrayBuffer响应中通过arrayBuffer获得fetch

fetch("raw/graph_tab.txt")
.then(response => {
    if (!response.ok) {
        throw new Error(response.status);
    }
    return response.arrayBuffer();
})
.then(buffer => {
    // ...convert it here...
})
.catch(error => {
    // Handle/report error
});

那么问题是我们为...convert it here...做些什么。 :-)您所引用的库期望得到一个“字节字符串”,我猜这与您从readAsBinaryString的{​​{1}}方法获得的字节字符串相同。如果是这样,您可以将FileReader转换为如下格式:

ArrayBuffer

所以:

const str = new Uint8Array(buffer).map(byte => String.fromCharCode(byte)).join("");