【JavaScript】FileReader读取文件成功,但存储的数据为空——总结

目录

问题

如题,使用下列代码读取上传的文件:
在这里插入图片描述

for (let i = 0; i < files.length; i++) {
    const reader = new FileReader();
    const fileName = files[i].name;
    reader.onload = function(e) {
        file_datas[fileName] = e.target.result;
    }
    // 根据需要设置读取模式:'text' 或 'binary'
    reader.readAsText(files[i]);
}

但是通过debugconsole.log输出的file_datas都为空,并没有任何数据。

这时候尝试在循环的过程中输出数据,发现是可以输出结果的。

解决

也就是说,中间赋值的时候值是存在的,那么 有可能是变量的作用域问题或者其它。

但是变量是在函数外定义的,所以排除作用域的问题。

真正的原因是:FileReader读取文件是异步的,所以在代码执行完但是还未读取完,所以可能出现空值的情况。

这时候将代码修改,用Promise 或 async/await 等方式来处理异步操作的结果:

        function readFile(file) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                reader.onload = function(e) {
                    resolve(e.target.result);
                };
                reader.onerror = function(e) {
                    reject(e);
                };
                reader.readAsText(file);
            })
        }

        async function handleFiles(files) {
            const file_datas = {};
            const promises = [];
            for (let i = 0; i < files.length; i++) {
                const fileName = files[i].name;
                const promise = readFile(files[i])
                .then(fileContent => {
                    file_datas[fileName] = fileContent;
                })
                .catch(error => console.log(error));
                promises.push(promise);
            }
            await Promise.all(promises);
            // console.log(file_datas);
            // 等待文件读取完成后再发送数据
        }

        handleFiles(files);

将处理函数放在文件读取完毕后即可。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,您想了解如何使用JavaScript中的FileReader对象来读取文件。首先,您需要创建一个FileReader对象,然后使用它的readAsText()方法读取文件内容。以下是一个简单的示例: ```javascript // 创建一个FileReader对象 var reader = new FileReader(); // 读取文件 reader.readAsText(file); // 当读完成时,执行回调函数 reader.onload = function(event) { var contents = event.target.result; console.log(contents); }; ``` 在这个示例中,我们首先创建一个FileReader对象。然后,我们使用它的readAsText()方法来读一个文件。该方法接受一个File对象作为参数,该对象代表要读的文件。在这个例子中,我们假设已经有一个名为file的File对象。 当读完成后,FileReader对象将触发一个load事件。我们可以通过在FileReader对象的onload属性上设置一个回调函数来捕获这个事件。在回调函数中,我们可以通过调用event.target.result来获文件的内容。在这个例子中,我们简单地将内容打印到控制台上。 请注意,由于读取文件是异步操作,因此我们需要等待读完成后才能访问文件的内容。因此,我们将回调函数分配给FileReader对象的onload属性,以便在读完成时自动调用。 ### 回答2: FileReader 是一种用于读取文件内容的JavaScript 对象。当我们需要读一个文本文件中的内容时,可以使用FileReader 对象。FileReader 对象提供了一系列的方法和属性,使我们能够以异步的方式读取文件。 要使用FileReader 对象来读取文件,我们需要先创建一个FileReader 实例,然后通过其方法来读取文件。首先,我们需要使用input 元素的type 属性设置为“file”,这样可以让用户选择一个本地的文件。接着,我们在JavaScript中获到选择的文件对象,并使用FileReader 实例的readAsText() 方法来读取文件内容。readAsText() 方法的参数可以指定文件编码类型,一般情况下我们可以使用默认的UTF-8 编码。 在读取文件内容的过程中,FileReader 对象会触发onload 事件,我们可以通过监听这个事件来获到文件内容。在onload 事件的回调函数中,我们可以通过FileReader 实例的result 属性获到文件的内容。可以通过调用FileReader 实例的readAsDataURL() 方法来将读到的文件内容转换为数据URL,然后可以将这个URL 用于显示文件的预览或者动态加载文件。 总结来说,FileReader 提供了一种方便的方式来读文本文件的内容。通过其方法和事件,我们能够以异步的方式读取文件内容,并可以对文件进行一系列的操作。使用FileReader 可以给我们的开发带来很大的便利,特别是在需要加载本地文件内容的场景下。 ### 回答3: FileReader是一个内置对象,可以用来读取文件内容。它提供了多种方法来读不同类型的文件,如文本文件、图片文件等。使用FileReader对象是一种异步操作,可以通过注册事件监听器来处理读完成后触发的事件。 首先,我们需要使用FileReader的构造函数创建一个实例,然后使用其中的方法来读取文件。常见的方法有readAsText()、readAsArrayBuffer()和readAsDataURL()。 readAsText()方法用于读文本文件,它会将文件内容以字符串的形式返回。使用该方法时,我们需要为FileReader对象的onload事件注册一个监听器,该监听器会在读完成后触发。在该监听器中,可以通过调用FileReader对象的result属性获文件内容。 readAsArrayBuffer()方法用于读二进制文件,如图片或音频文件。它会将文件内容以ArrayBuffer的形式返回。使用该方法时,同样需要为FileReader对象的onload事件注册监听器,然后在监听器中通过FileReader对象的result属性获文件内容。 readAsDataURL()方法用于读取文件并将其转换为DataURL格式。DataURL是一种将文件内容编码为字符串的方式,可以用于在网页中显示图片。与之前的方法一样,需要注册onload事件监听器来获文件内容。 总之,FileReader是用于读取文件内容的工具,提供了多种方法来满足不同类型的文件读需求。读取文件时需要注册监听器,在监听器中获文件内容并进行后续操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗夜无风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值