搞懂前端二进制系列(二):🍈File、FileReader与Base64
参考资料:
- JavaScript高级程序设计第四版:File API
- https://juejin.cn/post/7046313942938812424【前端二进制一次搞清楚】
一、File 类型
Web 应用程序的一个主要的痛点是无法操作用户计算机上的文件。2000 年之前,处理文件的唯一方
式是把<input type="file">放到一个表单里,仅此而已。File API 与 Blob API 是为了让 Web 开发者
能以安全的方式访问客户端机器上的文件,从而更好地与这些文件交互而设计的
File API 仍然以表单中的文件输入字段为基础,但是增加了直接访问文件信息的能力,每个 File 对象都有一些
只读属性:
属性 | 说明 |
---|---|
name | 本地系统中的文件名 |
size | 以字节计的文件大小 |
type | 包含文件 MIME 类型的字符串 |
lastModifiedDate | 表示文件最后修改时间的字符串。这个属性只有 Chome 实现了 |
构造方法
const file = new File(array, name[, options])
array
是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString
等对象构成,DOMStrings
会被编码为UTF-8name
表示文件名称,或者文件路径options
是一个可选,它可能会指定如下两个属性:- type,默认值为
""
,内容的MIME类型 - lastModified: 数值,表示文件最后修改时间的 Unix 时间戳(毫秒)。默认值为 Date.now()
- type,默认值为
常见的MIME类型,请参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
成员方法:
由于Blob是File的超集,因此,下面的方法几乎和blob一样
方法 | 说明 |
---|---|
slice() | 从 Blob 中截取一部分并返回一个新的 Blob (用法同数组的 slice ) |
arrayBuffer() | 返回一个以二进制形式展现的 promise |
stream() | 返回一个ReadableStream 对象 |
text() | 返回一个文本形式的 promise |
// 转成stream
console.log(file1.stream());
// 转成Arraybuffer
file1.arrayBuffer().then((res) => {
console.log(res);
});
// 转成文本
file1.text().then((res) => {
console.log(res);
});
二、FileReader
FileReader类型表示一种异步文件读取机制。可以把FileReader 想象成类似于XMLHttpRequest,
只不过是用于从文件系统读取文件,而不是从服务器读取数据。
属性
属性 | 说明 |
---|---|
error | 表示在读取文件时发生的错误 |
result | 返回文件的内容。只有在读取操作完成后,此属性才有效,返回的数据的格式取决于是使用哪种读取方法来执行读取操作的。 |
readyState | 表示FileReader状态的数字。0 还没有加载任何数据。1 数据正在被加载。2 已完成全部的读取请求 |
方法
需要注意的是 ,无论读取成功或失败,方法并不会返回读取结果,这一结果存储在 result属性中
方法名 | 说明 |
---|---|
abort() | 中止读取操作。在返回时,readyState 属性为 DONE。 |
readAsArrayBuffer() | 将读取的内容转成ArrayBuffer |
readAsBinaryString() | 将读取的内容转成二进制数据 |
readAsDataURL() | 将读取的内容转成并将其编码为 base64 的 data url。 格式是 data:[<mediatype>][;base64],<data> |
readAsText() | 将数据读取为给定编码(默认为 utf-8 编码)的文本字符串 |
事件
事件名 | 说明 |
---|---|
onabort | 处理 abort 事件。该事件在读取操作被中断时触发 |
onerror | 处理 error 事件。该事件在读取操作发生错误时触发 |
onload | 处理 load 事件。该事件在读取操作完成时触发 |
onloadstart | 处理 loadstart 事件。该事件在读取操作开始时触发 |
onloadend | 处理 loadend 事件。该事件在读取操作结束时(要么成功,要么失败)触发 |
onprogress | 处理 progress 事件。该事件在读取Blob时触发 |
例子
<input type="file" id="files-list" multiple>
<div id="output"></div>
<div id="progress"></div>
<script>
window.onload = function() {
let filesList = document.getElementById("files-list");
filesList.addEventListener("change", (event) => {
let info = "",
output = document.getElementById("output"),
progress = document.getElementById("progress"),
files = event.target.files,
type = "default",
reader = new FileReader();
if ( /image/.test(files[0].type) ) {
reader.readAsDataURL(files[0]);
type = "image";
} else {
reader.readAsText(files[0]);
type = "text";
}
reader.onerror = function () {
output.innerHTML = "Could not read file, error code is " +
reader.error.code;
};
reader.onprogress = function (event) {
if ( event.lengthComputable ) {
progress.innerHTML = `${ event.loaded }/${ event.total }`;
}
};
reader.onload = function () {
let html = "";
switch (type) {
case "image":
html = `<img src="${ reader.result }">`;
break;
case "text":
html = reader.result;
break;
}
output.innerHTML = html;
};
});
}
</script>
以上代码从表单字段中读取一个文件,并将其内容显示在了网页上。如果文件的 MIME 类型表示它
是一个图片,那么就将其读取后保存为数据 URI,在 load 事件触发时将数据 URI 作为图片插入页面中。
如果文件不是图片,则读取后将其保存为文本并原样输出到网页上。progress 事件用于跟踪和显示读
取文件的进度,而 error 事件用于监控错误。
如果想提前结束文件读取,则可以在过程中调用 abort()方法,从而触发 abort 事件。在 load、
error 和 abort 事件触发后,还会触发 loadend 事件。loadend 事件表示在上述 3 种情况下,所有读
取操作都已经结束。
三、Base64
Base64是一种编码格式,在前端经常会碰到,格式是 data:[<mediatype>][;base64],<data>
。
除了使用工具进行Base64编码外,js还内置了两个方法能进行字符串的Base64的编码和解码。
Base64目的不是为了加密解密,二是为了能完整无差错的传输数据
优点:
- 可以将二进制数据(比如图片)转化为可打印字符,方便传输数据
- 对数据进行简单的加密,肉眼是安全的
- 如果是在html或者css处理图片,可以减少http请求
缺点:
- 内容编码后体积变大, 至少1/3
因为是三字节变成四个字节,当只有一个字节的时候,也至少会变成三个字节 - 编码和解码需要额外工作量
例子
除了使用工具进行Base64编码外,js还内置了两个方法能进行字符串的Base64的编码和解码
const str1 = "hello randy";
// 编码
const b1 = window.btoa(str1);
console.log(b1); // aGVsbG8gcmFuZHk=
// 解码
const str2 = window.atob(b1);
console.log(str2); // hello randy
不过需要值得注意的是,这两个自带的方法不能加密中文
搞懂前端二进制系列(二):🍈File、FileReader与Base64的更多相关文章
- 搞懂前端二进制系列(一):🍇 认识Blob对象
参考资料: https://juejin.cn/post/6844904183661854727 [你不知道的Blob] https://juejin.cn/post/6844904144453517 ...
- 前端进阶系列(二):css常见布局解决方案
水平居中布局 margin+定宽 <div class="parent"> <div class="child">Demo</di ...
- 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输
HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...
- 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
随机推荐
- [漏洞复现] [Vulhub靶机] OpenSSL Heartbleed Vulnerability (CVE-2014-0160)
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 传输层安全协议SSL 安全套接字协议SSL(Secure Sockets Layer),及其继任者传输层安 ...
- 聚类--DBSCN
1.什么是DBSCN DBSCAN也是一个非常有用的聚类算法. 它的主要优点:它不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点. DBSCAN比凝聚聚类和k均值稍慢 ...
- 广义SAM
参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串. 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树. ...
- CabloyJS 4.12震撼发布,及新版教程尝鲜
引言 凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写 | Atwood 定律 目前市面上出现的大多数与 NodeJS 相关的框架,基本都将 NodeJS 定位在工 ...
- ElasticSearch6.4.2
做一个简单的API记录 1.依赖为6.4.2 比较老的版本 2.指定ES集群,可接多个Put(); Setting setting=Setting.builder().put("clust ...
- XDEBUG 选项
到官网 http://www.xdebug.com/download.php 下载 找到对应PHP版本的 Xdebug ,后面带 TS 的为线程安全,本机环境为 win7 64 + php-5.5.1 ...
- 为什么要使用TypeScript(Why Typescript?)
客观原因 静态类型. 在编译期即可进行静态类型分析, 减少JS运行时类型错误. 语法功能强大 对于大型项目具有更好构建机制,加入了类.接口.泛型.模块等概念. 兼容JavaScript 与现存的Jav ...
- JS:三目运算符
语法:条件表达式?表达式1:表达式0 注:当条件表达式为true则选择表达式1,反之false则选择表达式0 例: var a = 0; var b = 1; re=a>b?a:b consol ...
- Django快速入门之项目配置
开始 环境 python:3.6.2 django:2.0.5 跑起来 用pycharm导入或新建一个Django项目,在目录中存在manage.py的文件,通过下列指令运行Django后台. pyt ...
- XAMPP Apache安装时问题总结
昨天遇到的一个问题,安装XAMPP后无法启动Apache服务,本以为可能是一些系统服务文件被占用的原因,安装软件后需重启一遍.可是重启计算机后依然无法启动Apache服务,状态栏里总是显示" ...