ArrayBuffer / Blob 对象
最后更新于:2022-04-02 03:25:24
[TOC]
> [网道](https://wangdoc.com/javascript/bom/arraybuffer.html)
## ArrayBuffer 对象 操作内存
ES6 新增
```
var buffer = new ArrayBuffer(8);
buffer.byteLength // 8
```
## Blob 对象 操作二进制对象
- 一个图片文件的内容就可以通过 Blob 对象读写
- 它通常用来读写文件
- 它与 ArrayBuffer 的区别在于,它用于操作二进制文件,而 ArrayBuffer 用于操作内存
语法
```
new Blob(array [, options])
array 数组,成员是字符串或二进制对象
表示新生成的Blob实例对象的内容
options 可选
type 数据的 MIME 类型
```
实例
```
var htmlFragment = ['hey!'];
var myBlob = new Blob(htmlFragment, {type : 'text/html'});
//or
var obj = { hello: 'world' };
var blob = new Blob([ JSON.stringify(obj) ], {type : 'application/json'});
```
### 实例
#### 创建文件并下载
```
// html
asdad
// js
function downFile(a) {
let file = new File(['hello world'], 'test.txt', {type: 'text/plain'});
a.download="asd.txt"
a.href= URL.createObjectURL(file)
}
```
#### 获取文件信息
函数触发
```
// HTML 代码如下
//
function fileinfo(files) {
for (var i = 0; i < files.length; i++) {
var f = files[i];
console.log(
f.name, // 文件名,不含路径
f.size, // 文件大小,Blob 实例属性
f.type, // 文件类型,Blob 实例属性
f.lastModifiedDate // 文件的最后修改时间
);
}
}
```
监听
```
document.querySelectorAll('input').forEach(function (t) {
t.addEventListener('change',function (e) {
console.log(this.files); //文件信息数组
})
})
```
#### AJAX下载文件
AJAX 请求时,如果指定`responseType`属性为`blob`,下载下来的就是一个 Blob 对象。
```
function getBlob(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.onload = function () {
callback(xhr.response);
}
xhr.send(null);
}
```
#### 生成 URL(拖拉预览图片)
- 浏览器允许使用URL.createObjectURL()方法,针对 Blob 对象生成一个临时 URL,以便于某些 API 使用
- 这个 URL 以`blob://`开头,表明对应一个 Blob 对象,协议头后面是一个识别符,用来唯一对应内存里面的 Blob 对象
```
图片预览:
//js
document.addEventListener('dragover', function (event) {
// 防止拖拉效果被重置,允许被拖拉的节点放入目标节点
event.preventDefault();
}, false);
document.addEventListener('drop', function( event ) {
// 防止事件默认行为(比如某些元素节点上可以打开链接),
event.preventDefault();
if (event.target.className == "dropzone") {
event.target.style.background = '';
var files = event.dataTransfer.files;
for (var i = 0; i < files.length; i++) {
var type = files[i].type;
if (type.substring(0, 6) !== 'image/')
continue;
var img = document.createElement('img');
img.src = URL.createObjectURL(files[i]);
img.onload = function () {
this.width = 100;
document.querySelector('#view').appendChild(this)
URL.revokeObjectURL(this.src);
}
}
}
});
```
#### 读取文件
取得 Blob 对象以后,可以通过FileReader对象,读取 Blob 对象的内容,即文件内容
* `FileReader.readAsText()`:返回文本,需要指定文本编码,默认为 UTF-8。
* `FileReader.readAsArrayBuffer()`:返回 ArrayBuffer 对象。
* `FileReader.readAsDataURL()`:返回 Data URL。
* `FileReader.readAsBinaryString()`:返回原始的二进制字符串
`FileReader.readAsText()` 用于读取文本文件
```
//
//
function readfile(f) {
var reader = new FileReader();
reader.readAsText(f);
reader.onload = function () {
var text = reader.result;
var out = document.getElementById('output');
out.innerHTML = '';
out.appendChild(document.createTextNode(text));
}
reader.onerror = function(e) {
console.log('Error', e);
};
}
```
`FileReader.readAsArrayBuffer()`方法的例子,用于读取二进制文件
```
// HTML 代码如下
//
function typefile(file) {
// 文件开头的四个字节,生成一个 Blob 对象
var slice = file.slice(0, 4);
var reader = new FileReader();
// 读取这四个字节
reader.readAsArrayBuffer(slice);
reader.onload = function (e) {
var buffer = reader.result;
// 将这四个字节的内容,视作一个32位整数
var view = new DataView(buffer);
var magic = view.getUint32(0, false);
// 根据文件的前四个字节,判断它的类型
switch(magic) {
case 0x89504E47: file.verified_type = 'image/png'; break;
case 0x47494638: file.verified_type = 'image/gif'; break;
case 0x25504446: file.verified_type = 'application/pdf'; break;
case 0x504b0304: file.verified_type = 'application/zip'; break;
}
console.log(file.name, file.verified_type);
};
}
```
';