HTML 5中的文件处理之FileAPI

news2024/12/24 10:14:19

在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅 长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理 较为复杂或底层的数据。今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。

AD:

在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一。但文件处 理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理较为复杂或底层的数据。 今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。

今天要介绍的FileAPI,就是为解决这类问题而生的。

总览

FileAPI是一些列文件处理规范的基础,包含最基础的文件操作的JavaScript接口设计。其中最主要的接口定义一共有4个:

◆ FileList接口: 可以用来代表一组文件的JS对象,比如用户通过input[type="file"]元素选中的本地文件列表

◆ Blob接口: 用来代表一段二进制数据,并且允许我们通过JS对其数据以字节为单位进行“切割”

◆ File接口: 用来代步一个文件,是从Blob接口继承而来的,并在此基础上增加了诸如文件名、MIME类型之类的特性

◆ FileReader接口: 提供读取文件的方法和事件

这里有两点细节需要注意:

1. 我们平时使用input[type="file"]元素都是选中单个文件,其本身是允许同时选中多个文件的,所以会用到FileList

2. Blob接口和File接口可以返回数据的字节数等信息,也可以“切割”,但无法获取真正的内容,这也正是FileReader存在的意义,而文件大小不一时,读取文件可能存在明显的时间花费,所以我们用异步的方式,通过触发另外的事件来返回读取到的文件内容

接口描述

这4个接口其实并不复杂,也很好理解(接口中的“#Foo”表示任意Foo类型的对象):

FileList接口

  1. #FileList[index] // 得到第index个文件 

Blob接口

  1. #Blob.size // 只读特性,数据的字节数  
  2. #Blob.slice(start, length) // 将当前文件切割并将结果返回 

File接口

  1. #File.size // 继承自Blob,意义同上  
  2. #File.slice(start, length) // 继承自Blob,意义同上  
  3. #File.name // 只读属性,文件名  
  4. #File.type // 只读属性,文件的MIME类型  
  5. #File.urn // 只读属性,代表该文件的URN,几乎用不到,暂且无视 

FileReader方法

  1. #FileReader.readAsBinaryString(blob/file) // 以二进制格式读取文件内容  
  2. #FileReader.readAsText(file, [encoding]) // 以文本(及字符串)格式读取文件内容,并且可以强制选择文件编码  
  3. #FileReader.readAsDataURL(file) // 以DataURL格式读取文件内容  
  4. #FileReader.abort() // 终止读取操作 

FileReader事件

  1. #FileReader.onloadstart // 读取操作开始时触发  
  2. #FileReader.onload // 读取操作成功时触发  
  3. #FileReader.onloadend // 读取操作完成时触发(不论成功还是失败)  
  4. #FileReader.onprogress // 读取操作过程中触发  
  5. #FileReader.onabort // 读取操作被中断时触发  
  6. #FileReader.onerror // 读取操作失败时触发 

FileReader属性

  1. #FileReader.result // 读取的结果(二进制、文本或DataURL格式)  
  2. #FileReader.readyState // 读取操作的状态(EMPTY、LOADING、DONE) 

代码示例

举例一:控制file控件,读取其中的第二个文件,并将其文本内容在控制台输出

  1. var input = document.querySelector('input[type="file"]'); // 找到第一个file控件  
  2. var firstFile = input.files[0]; // file控件的files特性其实就是一个FileList类型的对象  
  3. var secondFile = input.files[1]; // 当file控件的multiple特性为true时,我们可以同时选择多个文件,通过input.files[n]可以按序访问这些文件  
  4. var reader = new FileReader(); // 新建一个FileReader类型的对象  
  5. reader.readAsText(secondFile); // 按文本格式读取file控件中的第二个文件  
  6. reader.onloadend = function (e) { // 绑定读取操作完成的事件  
  7.     console.log(reader.result); // 取得读取结果并输出  
  8. }; 

举例二:给一个含utf-8编码的文本文件file去掉BOM头信息

  1. var size = file.size; // 先取得文件总字节数  
  2. var result = file.slice(3, size - 3); // 用slice方法去掉开头的3个字节 

最后,对FileAPI实践的三点注意

1. 由于规范尚未截稿,#File.urn尚存较大变数,webkit并未实现此特性

2. #Blob.slice在webkit内核中加入了前缀,即#Blob.webkitSlice,且第二个参数不是“length”,而是“end”,话句话说,上面的示例二应改为file.webkitSlice(3, size)才能生效

3. 规范中还明确规定了各种出错处理和异常处理,这些内容是同样重要的:不论对于一套完备的规范,还是对于一个健壮的程序而言。由于篇幅有限,这部分就不细说了,大家可以在W3C官网自由查阅

以上就是FileAPI的简单介绍。万丈高楼平地起,后面的文件操作会更神奇更有趣。

个人整理学习路线&笔记icon-default.png?t=N4P3https://mp.weixin.qq.com/s/KQx_eIwdjCj3QdErxKb7ZQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT国内的一些产品真的比国外的差吗?(篇幅较长,请收藏)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 本次讨论的话题仅限于计算机视觉研究院个人观点,若有说的不对的地方勿喷,有…

k8s之docker-扩展知识(八)

一.Docker的应用场景 Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 二.Docker 的优点 Docker 是一个用于开发&#…

【ChatGPT】Mr. Ranedeer:可定制个性化学习体验的 GPT-4 AI 导师提示

Mr. Ranedeer AI Tutor是一个可定制的提示,为具有不同需求和兴趣的用户提供个性化的学习体验。它使用GPT-4来释放AI的潜力,并允许您调整知识深度以匹配您的学习需求,自定义学习风格,沟通类型,语气和推理框架 。 当您使…

ISO21434 组织网络安全管理(二)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 4.1 网络安全治理 4.2 网络安全文化 4.3 信息共享 4.4 管理系统 4.5 工具管理 4.6 信息安全管理 4.7 组织网络安全审计 五、输出 一、概述 为了实现网络安全工程,该…

自动驾驶TPM技术杂谈 ———— 车辆分类

文章目录 机动车规格机动车结构机动车使用性质机动车和挂车分类接近角定义离去角定义纵向通过角定义离地间隙定义前后轴之间的离地间隙轴下离地间隙 机动车规格 机动车规格分类 分类 说明 汽车 载客汽车 大型 车长大于或等于 6000mm 或者乘坐人数大于或等于20 人的载客汽车。 …

【微信小程序开发】第 4 节 - 创建小程序项目

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、点击 “加号” 按钮 3、项目创建完成 4、在模拟器上查看项目效果 5、在真机上预览项目效果 6、主页面的 5 个组…

安卓调试|一文归纳总结adb调试工具常规命令

欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! “ 花开堪折直须折,莫待无花空折枝。 ” 作者主页:[ https://www.weiyigeek.top ] 博客&…

FPGA PAL视频BT656解码Video Processing Subsystem去隔行工程源码 TW2867采集4路视频拼接输出 提供技术支持

目录 1、前言2、我这里已有的PAL视频解码方案3、模拟视频概述4、模拟视频颜色空间5、逐行与隔行6、BT656数据与解码BT656数据格式BT656数据解码 7、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析 8、设计思路与框架9、vivado工程详解Block Design设计SDK设计…

chatgpt赋能python:Python奇偶数求和方法详解

Python奇偶数求和方法详解 在日常的编程开发中,经常需要对数字进行分类求和,其中“奇偶数求和”更是最常见的问题之一。而Python作为一种高效、可靠的编程语言,其在求解奇偶数的优秀性能备受瞩目。接下来本篇文章将详细介绍Python奇偶数求和…

Redis为什么会这么快?Redis到底有多快?

文章目录 一、redis到底有多快?二、redis为什么这么快1、内存存储(1)虚拟存储器(虚拟内存Virtual Memory)(2)用户空间和内核空间 2、单线程(1)进程切换(上下文…

Flutter 小技巧之 3.10 全新的 MediaQuery 优化与 InheritedModel

关于 MediaQuery 我们介绍过不少,比如在之前的《MediaQuery 和 build 优化你不知道的秘密》里就介绍过,要慎重在 Scaffold 之外使用 MediaQuery.of(context) ,这是因为 MediaQuery.of 对 BuildContext 的绑定可能会导致一些不必要的性能开销&…

vue项目仿企业微信移动端(带聊天界面)

网上比较知名的网站或者软件,开源代码中都有仿其前端的。比如小米商城,京东商城,仿微信聊天页面诸如此类的。所以我潜意识觉得像那种知名公司或者软件。想找它的仿前端静态代码应该很好找。结果,当我想找仿企业微信移动端的前端静…

springboot+vue住房分配管理系统vue

本城镇保障性住房管理系统管理员,用户。管理员功能有个人中心,用户管理,房屋类型管理,房源信息管理,房源申请管理,住房分配管理,留言板管理,系统管理等。因而具有一定的实用性。 本…

c++11 标准模板(STL)(std::bitset)(四)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssign…

华为OD机试真题 Java 实现【矩阵稀疏扫描】【2023 B卷 100分】,附详细解题思路

一、题目描述 如果矩阵中的许多系数都为零&#xff0c;那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省&#xff0c;并且在许多大的实践中都会出现矩阵稀疏的问题。 给定一个矩阵&#xff0c;现在需要逐行和逐列地扫描矩阵&#xff0c;如果某一…

使用阿里云免费Serverless函数计算产品资源安装 Stable Diffusion

喜欢用 Stable Diffusion 的小伙伴注意了&#xff01;上一篇介绍了使用谷歌的 Colab 免费资源来安装这个画图神器。 但因为资源是免费的&#xff0c;高峰时期有可能会被谷歌断掉服务的连接&#xff0c;像周末这种使用高峰&#xff0c;GPU 的资源得不到保证。 没关系&#xff0c…

WPF开发txt阅读器:需求分析和文件读写

文章目录 需求分析读取文本文件保存文本文件 需求分析 尽管现在比较主流的阅读格式已经是epub, modi之类的&#xff0c;但txt的使用范围要远比前两者广泛&#xff0c;所以做一个txt阅读器还是有必要的。 但是对于书籍阅读而言&#xff0c;纯文本不包含目录信息&#xff0c;这…

chatgpt赋能python:Python奇数偶数判断:从基础语法到优化运行

Python奇数偶数判断&#xff1a;从基础语法到优化运行 Python是一门简单易学的编程语言&#xff0c;并且在科学计算、数据处理和人工智能等领域都有广泛的应用。在Python中&#xff0c;判断一个数是奇数还是偶数是一个基础问题&#xff0c;本文将介绍Python中奇数偶数的判断方…

事务与项目跟踪软件Jira

本文软件应网友 不长到一百四誓不改名 要求折腾&#xff1b; 什么是 Jira &#xff1f; Jira 是由 Atlassian 开发的跟踪和管理任务的软件开发工具&#xff0c;您可以将它用于敏捷和瀑布项目管理&#xff0c;以跟踪错误、功能和其他工作项。您还可以将 JIRA 配置为与许多服务管…

Leetcode之二分查找

1. 二分查找 二分查找的前提条件是&#xff1a;有序数组。 二分查找的递归实现&#xff1a; class Solution: def search_recur(self,nums:List[int],low:int,high:int,target:int):if low > high:return -1mid low (high - low) // 2if nums[mid] target:return midel…