首页 教程 Web前端 【JS】前端文件读取FileReader操作总结

【JS】前端文件读取FileReader操作总结

前言:开发中经常遇到文件上传的场景,有时需要前端将文件内容读取出来再以base64格式传到接口。

目录
  • FileReader
    • 主要方法
      • readAsArrayBuffer(blob)
      • readAsText(blob, [encoding])
      • readAsDataURL(blob)
    • 主要事件
    • React + antd Upload 组件示例

FileReader

FileReader 是一个对象,允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

构造函数:

let reader = new FileReader(); // 没有参数

主要方法

readAsArrayBuffer(blob)

将数据读取为二进制格式的 ArrayBuffer。当读取操作完成时,readyState 变成 DONE(已完成),并触发 loadend 事件,同时 result 属性中将包含一个 ArrayBuffer 对象以表示所读取文件的数据。

reader.readAsArrayBuffer(blob)

readAsText(blob, [encoding])

将数据读取为给定编码(默认为 utf-8 编码)的文本字符串。

instanceOfFileReader.readAsText(blob[, encoding]);

readAsDataURL(blob)

读取二进制数据,并将其编码为 base64 的 data url。

reader.readAsDataURL(blob);

读取方法都是异步的,也就是说只有当执行完成后才能够查看到结果,如果直接查看是无结果的,并返回 undefined。必须要挂载 实例下的 onload 或 onloadend 的方法才能处理转化后的结果

FileReader的三个属性:

  1. error: 返回读取时的错误信息
  2. readyState: 返回操作的当前状态
  3. result: 返回读取文件的结果

读取文件的示例:
参考 https://blog.csdn.net/qq_60440599/article/details/136071142

<input type="file" onchange="readFile(this)"> <script> function readFile(input) { let file = input.files[0]; let fileReader= new FileReader(); fileReader.readAsText(file); // 或者 fileReader.readAsArrayBuffer(file) /** * 该方法在读取时调用 */ fileReader.onloadstart = () => { console.log("开始读取") console.log(fileReader.readyState)//调用函数,但还没有结束,返回1 } /** * 该方法在读取成功时调用 */ fileReader.onload = () => { console.log("读取成功") console.log(fileReader.result) console.log(fileReader.readyState)//调用完成,返回2 } /** * 该方法在读取结束时调用 */ fileReader.onloadend = () => { console.log("读取结束") } /** * 读取过程中触发 */ fileReader.onprogress = (e) => { console.log("读取中") //获取已经加载的数据量 console.log("loaded==>" + e.loaded) } /** * 该方法在调用abort函数时触发 */ fileReader.onabort = () => { console.log("操作终止") } //当读取出现失败时触发 fileReader.onerror = () => { console.log("出现错误") console.log(fileReader.error) } } </script>


read 方法的选择tips:

  • readAsArrayBuffer —— 用于二进制文件,执行低级别的二进制操作。对于诸如切片(slicing)之类的高级别的操作,File 是继承自 Blob 的,所以可以直接调用它们,而无需读取。

  • readAsText —— 用于文本文件,当我们想要获取字符串时。

  • readAsDataURL —— 用于在 src 中使用此数据,并将其用于img 或其他标签时。

    还有一种用于此的读取文件的替代方案:URL.createObjectURL(file)

示例:根据用户传入的图片文件,来生成一个对应的临时url,并将临时url作为src传给img标签

<input type="file" id="file"> <img id="img"> let file = document.getElementById("file") let img= document.getElementById("img") file.addEventListener("change", (e) => { let fileList=e.target.files //先获取一份文件 //这里获取的才是File对象 let file = fileList[0] //因为file也是Blob对象,所以直接传入即可 img.src=URL.createObjectURL(file) })

主要事件

读取过程中,有以下事件:

  • loadstart —— 开始加载。
  • progress —— 在读取过程中出现,当FileReader读取数据时,进度事件会定期触发。
  • load —— 读取完成时触发,没有 error。
  • abort —— 在中止读取时会触发 abort 事件:例如程序调用 abort()。。
  • error —— 出现 error时触发。
  • loadend —— 读取完成,无论成功还是失败。

读取完成后,可以通过以下方式访问读取结果:

  • reader.result 是结果(如果成功)
  • reader.error 是 error(如果失败)。

检测浏览器对 FileReader 的支持:

if(window.FileReader) { var fr = new FileReader(); // add your code here }else { alert("Not supported by your browser!"); }

React + antd Upload 组件示例

场景: 表单文件上传,读取后以base64格式与表单一起传给后端。

<Upload maxCount={1} accept=".jpg,.jpeg,.png" beforeUpload={(file) => { console.log('文件类型', file.type, file); // 限制文件类型 const allowTypes = [ 'image/png', 'image/jpeg', 'image/jpg', ]; const isAllowType = allowTypes.includes(file.type); // 校验文件大小和类型 if (!isAllowType || file.size / 1024 / 1024 > 4) { message.error('文件格式大小错误'); return Upload.LIST_IGNORE; } const reader = new FileReader(); //将上传的文件读取成base64 reader.readAsDataURL(file); reader.onloadend = function () { console.log('文件Base64内容',reader.result, file); }; // 阻止上传,为了最后和表单一起提交 return false; }} > <Button icon={<UploadOutlined />} type="primary"> 文件上传 </Button> </Upload>

评论(0)条

提示:请勿发布广告垃圾评论,否则封号处理!!

    猜你喜欢
    【MySQL】用户管理

    【MySQL】用户管理

     服务器/数据库  2个月前  2.15k

    我们推荐使用普通用户对数据的访问。而root作为管理员可以对普通用户对应的权限进行设置和管理。如给张三和李四这样的普通用户权限设定后。就只能操作给你权限的库了。

    Cursor Rules 让开发效率变成10倍速

    Cursor Rules 让开发效率变成10倍速

     服务器/数据库  2个月前  1.21k

    在AI与编程的交汇点上,awesome-cursorrules项目犹如一座灯塔,指引着开发者们驶向更高效、更智能的编程未来。无论你是经验丰富的老手,还是刚入行的新人,这个项目都能为你的编程之旅增添一抹亮色。这些规则文件就像是你私人定制的AI助手,能够根据你的项目需求和个人偏好,精确地调教AI的行为。突然间,你会发现AI不仅能理解Next.js的最佳实践,还能自动应用TypeScript的类型检查,甚至主动提供Tailwind CSS的类名建议。探索新的应用场景,推动AI辅助编程的边界。

    探索Django 5: 从零开始,打造你的第一个Web应用

    探索Django 5: 从零开始,打造你的第一个Web应用

     服务器/数据库  2个月前  1.12k

    Django 是一个开放源代码的 Web 应用程序框架,由 Python 写成。它遵循 MVT(Model-View-Template)的设计模式,旨在帮助开发者高效地构建复杂且功能丰富的 Web 应用程序。随着每个版本的升级,Django 不断演变,提供更多功能和改进,让开发变得更加便捷。《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体,是一本从零基础到精通Django Web企业级开发技术的实战指南《Django 5 Web应用开发实战》内容以。

    MySQL 的mysql_secure_installation安全脚本执行过程介绍

    MySQL 的mysql_secure_installation安全脚本执行过程介绍

     服务器/数据库  2个月前  1.08k

    mysql_secure_installation 是 MySQL 提供的一个安全脚本,用于提高数据库服务器的安全性

    【MySQL基础篇】概述及SQL指令:DDL及DML

    【MySQL基础篇】概述及SQL指令:DDL及DML

     服务器/数据库  2个月前  482

    数据库是长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库不仅仅是数据的简单堆积,而是遵循一定的规则和模式进行组织和管理的。数据库中的数据可以包括文本、数字、图像、音频等各种类型的信息。

    Redis中的哨兵(Sentinel)

    Redis中的哨兵(Sentinel)

     服务器/数据库  2个月前  308

    ​ 上篇文章我们讲述了Redis中的主从复制(Redis分布式系统中的主从复制-CSDN博客),本篇文章针对主从复制中的问题引出Redis中的哨兵,希望本篇文章会对你有所帮助。