资讯专栏INFORMATION COLUMN

AJAX 的进阶使用(Blob、ArrayBuffer、FormData、Document、JSON

wean / 984人阅读

摘要:让应用程序拥有异步读取存储在用户计算机上文件或原始数据缓冲区的能力,使用或对象指定要读取的文件或数据。对象用来表示通用的固定长度的原始二进制数据缓冲区。事实上,没有名为的全局对象,也没有一个名为的构造函数。

AjaxAsynchronous Javascript And XML (异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。在无需重新加载整个网页的情况下,能够更新部分网页的技术。一般我们使用 XMLHTTPRequestFetch APIActiveXObject(低版本 IE) ,来现实 AJAX 功能。

前言

如果你对前后端交互流程不熟悉可以看我之前写的简单的前后端交互流程(AJAX)。
如果你是想了解上传文件之类的,那么你可以看前端文件上传-javascript-ajax。

介绍一下上面提到的 AJAX 的 API(XHR、Fetch)

XMLHTTPRequest 我们现在用的最多的,基本能满足你的所有要求。但是我们日常只用了一部分 XML(早期),JSON(用的最多),text(比较少,要不然也是JSON串)。同时支持 progress 事件监视进度,事件实现 ProgressEvent 接口。2008年2月提出了XMLHttpRequest Level 2 草案。

可以通过设置一个 XMLHttpRequest 对象的 responseType 属性来改变一个从服务器上返回的响应的数据类型.可用的属性值为空字符串 (默认), "arraybuffer", "blob", "document", "json" 和 "text". response 属性的值会根据 responseType 属性包含实体主体(entity body), 它可能会是一个 ArrayBuffer, Blob, Document, JSON, string, 或者为NULL(如果请求未完成或失败)。

Fetch API 目前还不是 W3C 规范,是由 whatag 负责研发。核心在于对 HTTP 接口的抽象,包括 Request、Response、Headers、Body。得益于 JavaScript 实现的这些抽象好的 HTTP 模块,其他接口能够很方便的使用这些功能。Fetch 还利用到了请求的异步特性——它是基于 Promise 的。默认情况下,fetch 不会从服务端发送或接收任何 cookies。目前不支持 abort 也是一个槽点。

ActiveXObject 按理说不用理会这个东西,IE6 你还要啥自行车。功能少得可怜。

介绍一下进阶类型(Blob、ArrayBuffer、FormData)

Blob 表示一个不可变、原始数据的文件对象。

File 基于 Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。从 Blob 中读取内容的唯一方法是使用 FileReader,同理 File 也是使用 FileReader 读取(预览图片其实可以URL.createObjectURL(fileInput.files[0]) 生成 Blob 地址直接用,有效降低转为 base64 之后解析异常的风险)。

FileReader 让 Web应用程序拥有异步读取存储在用户计算机上文件(或原始数据缓冲区)的能力,使用 File 或 Blob 对象指定要读取的文件或数据。

FileReader.abort()
中止读取操作。在返回时,readyState 属性为 DONE。

FileReader.readAsArrayBuffer()
开始读取指定的 Blob 中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.

FileReader.readAsBinaryString()
开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含所读取文件的原始二进制数据。

FileReader.readAsDataURL()
开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个 data: URL 格式的字符串以表示所读取文件的内容。

FileReader.readAsText()
开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个字符串以表示所读取的文件内容。

File 对象可以是来自用户在一个  元素上选择文件后返回的 FileList 对象,也可以来自拖放操作生成的 DataTransfer 对象,还可以是来自在一个 HTMLCanvasElement 上执行 mozGetAsFile() 方法后返回结果。

Base64/readAsDataURL Base64是一组相似的二进制到文本(binary-to-text)的编码规则,使得二进制数据在解释成radix-64的表现形式后能够用ASCII字符串的格式表示出来。Base64 这个词出自一种MIME数据传输编码。

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。ArrayBuffer 不能直接操作,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

TypedArray 类型数组对象,描述一个底层的二进制数据缓存区的一个类似数组(array-like)视图。事实上,没有名为 TypedArray的全局对象,也没有一个名为的 TypedArray构造函数。相反,有许多不同的全局对象,下面会列出这些针对特定元素类型的类型化数组的构造函数。在下面的页面中,你会找到一些不管什么类型都公用的属性和方法。

类型 大小(字节单位) 描述 Web IDL type C语言中的等效类型
Int8Array 1 8位二进制带符号整数 -2^7~(2^7) - 1 byte int8_t
Uint8Array 1 8位无符号整数 0~(2^8) - 1 octet uint8_t
Int16Array 2 16位二进制带符号整数 -2^15~(2^15)-1 short int16_t
Uint16Array 2 16位无符号整数 0~(2^16) - 1 unsigned short uint16_t
Int32Array 4 32位二进制带符号整数 -2^31~(2^31)-1 long int32_t
Uint32Array 4 32位无符号整数 0~(2^32) - 1 unsigned int uint32_t
Float32Array 4 32位IEEE浮点数 unrestricted float float
Float64Array 8 64位IEEE浮点数 unrestricted double double

FormData 用以将数据编译成键值对,以便用 XMLHttpRequest 来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单 enctype 属性设为 multipart/form-data ,则会使用表单的 submit() 方法来发送数据,从而,发送数据具有同样形式。

骚操作

接下来就是我们的骚操作

前端播放amr ---测试,amr 不是原生支持的格式,那么我们拉到他的 Blob 然后解析,转码为其他格式。其实能拿到内容就能做好多事情了。比如解析歌词文件啊。

前端上传文件进度 ---测试,通过 upload.progress 来监听进度。

前端上传图片在线预览图片 ---测试,通过读取 File 内容,展示在页面上。

前端上传文件 主要使用 FormData ,也可以用 Blob。

先这样吧,想起来再补充。

参考资料

Sending and Receiving Binary Data --MDN

XMLHttpRequest --MDN

使用 Fetch --MDN

Base64的编码与解码 --MDN

Fetch 基本概念 --MDN

TypedArray

XMLHttpRequest Level 2 使用指南 --ruanyifeng

XMLHttpRequest Level 2 标准、CORS

传统 Ajax 已死,Fetch 永生

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102832.html

相关文章

  • 你不知道 XMLHttpRequest

    摘要:默认参数为空字符串密码,可选参数,用于授权。默认参数为空字符串备注如果不是有效的方法或地址不能被成功解析,将会抛出异常如果请求方法不区分大小写为或将会抛出异常重写由服务器返回的类型。 本文详细介绍了 XMLHttpRequest 相关知识,涉及内容: AJAX、XMLHTTP、XMLHttpRequest详解、XMLHttpRequest Level 1、Level 2 详解 XHR...

    ckllj 评论0 收藏0
  • 前端培训-初级阶段-场景实战(2019-06-06)-下载文件&下载进度

    摘要:前端最基础的就是。一个朋友的问题,监测下载进度。这节主要是讲如何使用,以及前端下载的核心操作。下载文件,并显示进度条。下载文件,并显示进度条下载文件上面已经实现了,那我们先说说如何显示进度条。实现代码如下,我们操作成读流,然后统计长度。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(H...

    sPeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<