// array 是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体。DOMString 会被编码为 UTF-8
var aBlob = new Blob( array, {type: '', endings: 'transparent'} );
// 示例
var aBlob = new Blob(['test!'], {
type: 'text/html'
});
// bits: 一个包含ArrayBuffer,ArrayBufferView,Blob,或者 DOMString 对象的数组 — 或者任何这些对象的组合。这是 UTF-8 编码的文件内容。
// name: 文件名或文件路径
// options: { type, lastModified } MIME 类型和最后修改时间
var myFile = new File(bits, name[, options]);
// 示例
var file = new File(['foo'], 'foo.txt', {
type: 'text/plain',
})
// HTML
<input type="file" id="fileInput">
// JS
const selectFile = document.getElementById('fileInput').files[0];
Streams API
流将你希望通过网络接收的资源拆分成小块,然后按位处理它。这正是浏览器在接收用于显示web页面的资源时做的事情——视频缓冲区和更多的内容可以逐渐播放,有时候随着内容的加载,你可以看到图像逐渐地显示。
示例:上传图片的预览
var img = document.createElement("img");
img.classList.add("obj");
img.file = file; // ?
preview.appendChild(img); // 假设"preview"就是用来显示内容的div
var reader = new FileReader();
reader.onload = (function(aImg) {
return function(e) {
// event.target.result 包含被转化为 type array 的 file
aImg.src = e.target.result;
};
})(img);
// readAsDataURL 方法用于将文件转换为二进制字符串
reader.readAsDataURL(file);
// 通过创建FileReader来处理异步的图片加载并把他赋给img元素。在创建一个新的 FileReader对象后,我们新建了它的onload 函数,然后调用readAsDataURL()函数开始后台读取文件。当整个图片文件的内容都被全部加载完后,它们被转换成了一个被传递到onload回调函数的data:URL。我们再执行常规操作将img元素的src属性设置为刚刚加载完毕的URL,使得图像可以显示在用户屏幕上的缩略图中。
var img = document.createElement("img");
img.src = window.URL.createObjectURL(files[i]);
img.height = 60;
// 当图片加载完成之后对象URL就不再需要了, 设置图片的load事件处理器来释放对象URL。
img.onload = function() {
window.URL.revokeObjectURL(this.src);
}
li.appendChild(img);
var info = document.createElement("span");
info.innerHTML = files[i].name + ": " + files[i].size + " bytes";
li.appendChild(info);
// HTML
<iframe id="viewer">
// JS
const obj_url = window.URL.createObjectURL(blob);
const iframe = document.getElementById('viewer');
iframe.setAttribute('src', obj_url);
window.URL.revokeObjectURL(obj_url);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", function(e) {
if(e.lengthComputable) {
var percentage = Math.round((e.loaded * 100) / e.total);
}
}, false);
WebSocket可以通过ArrayBuffer,发送或接收二进制数据。
let socket = new WebSocket('ws://127.0.0.1:8081');
socket.binaryType = 'arraybuffer';
// Wait until socket is open
socket.addEventListener('open', function (event) {
// Send binary data
const typedArray = new Uint8Array(4);
socket.send(typedArray.buffer);
});
// Receive binary data
socket.addEventListener('message', function (event) {
const arrayBuffer = event.data;
// ···
});
待研读
注意:btoa(‘中文’) btoa方法传入中文字符会报错:
// FileA.js
const paramA = encodeURLComponent('xxxx.xxxxxxxx.filename.txt');
const str = `http://baidu.com?paramA=${paramA}`;
// FileB.js
// 假设已经定义好了 getParamByUrl 方法,可从 URL 获取参数的
const paramA = decodeURLComponent(getParamByUrl(url, 'paramA'));
// 此处得到的 fileSuffix 值为 xxxx.xxxxxxxx.filename.txt, 而不是期望的 filename.txt
const fileSuffix = paramA.slice('.');