我试图通过创建一个函数来实现一个简单的文本文件阅读器,该函数接受文件的路径并将每行文本转换为字符数组,但它不起作用。
function readTextFile() {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", "testing.txt", true);
rawFile.onreadystatechange = function() {
if (rawFile.readyState === 4) {
var allText = rawFile.responseText;
document.getElementById("textSection").innerHTML = allText;
}
}
rawFile.send();
}
这里出了什么问题?
这似乎仍然不工作后,改变了代码一点点从以前的修订,现在它给我一个XMLHttpRequest异常101。
我已经在Firefox上测试过了,它可以工作,但在谷歌Chrome中,它不会工作,它一直给我一个101例外。我怎么能让它不仅在Firefox上工作,而且在其他浏览器(尤其是Chrome)上工作?
这是一个老问题,但有两个主要观点我们必须弄清楚。我们是想读取整个文件还是逐行获取?
泰欧,我想要完整的文件然后再处理。
好的,这很简单,我们只需调用text(记住,text假设文件是UTF-8编码的),并像这样处理文件:
const $output = document.getElementById('output')
const $file = document.getElementById('file')
const fetchFile = async e => {
Const [file] = e.target.files
Const text = await file.text()
美元输出。textContent = text
}
美元的文件。onchange = fetchFile
<input id='file' type='file' accept='text/plain'><br>
< pre id =“输出”>…< / >之前
那一行一行呢?这是可能的?
好吧,我的小徒弟,这也是可能的我们只需要像这样把文本分成几行
const $output = document.getElementById('output')
const $file = document.getElementById('file')
让数
const fetchFile = async e => {
Const [file] = e.target.files
If (!file)返回
计数= 0
Const text = await file.text()
美元输出。textContent = text
Const lines = text.split(/\r?\n/gm)
For (const line of lines) {
如果(行)计数++
}
console.log({数})
}
美元的文件。onchange = fetchFile
<input id='file' type='file' accept='text/plain'><br>
< pre id =“输出”>…< / >之前
您需要检查状态0(当使用XMLHttpRequest在本地加载文件时,您不会返回状态,因为它不是来自web服务器)
function readTextFile(file)
{
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function ()
{
if(rawFile.readyState === 4)
{
if(rawFile.status === 200 || rawFile.status == 0)
{
var allText = rawFile.responseText;
alert(allText);
}
}
}
rawFile.send(null);
}
在你的文件名中指定file://:
readTextFile("file:///C:/your/path/to/file.txt");
现代的解决方案:
使用fileOrBlob.text()如下所示:
<input type="file" onchange="this.files[0].text().then(t => console.log(t))">
当用户通过输入上传一个文本文件时,它将被记录到控制台。下面是一个工作中的jsbin演示。
这里有一个更详细的版本:
<input type="file" onchange="loadFile(this.files[0])">
<script>
async function loadFile(file) {
let text = await file.text();
console.log(text);
}
</script>
目前(2020年1月)这只适用于Chrome和Firefox,如果你将来读到这篇文章,请查看这里的兼容性:https://developer.mozilla.org/en-US/docs/Web/API/Blob/text
在旧的浏览器上,这应该是有效的:
<input type="file" onchange="loadFile(this.files[0])">
<script>
async function loadFile(file) {
let text = await (new Response(file)).text();
console.log(text);
}
</script>
相关:截至2020年9月,Chrome和Edge中提供了新的本地文件系统API,以防止你想要对用户选择的文件进行永久的读取访问(甚至是写入访问)。