最近写项目时遇到了向后台请求文件时,后台返回传输文件格式为二进制流的状况。正好借此机会了解文件二进制上传/读取的机制。服务器
Blob对象表示一个不可变的, 原始数据的相似文件对象,能够做为二进制文件存放的容器app
能够经过构造函数来构建 Blob 对象的。异步
var blob = new Blob(array[optional], options[optional]); // 第一个参数:数据序列,能够是任意格式的值, // 例如,任意数量的字符串,Blob 以及 ArrayBuffers // 第二个参数:用于指定将要放入Blob中的数据的类型
Blob 对象的基本属性:函数
经过formData对象实现异步上传二进制文件.net
建立一个空 FormData 对象,向 FormData 对象中添加文件对应的键/值对firefox
var formData = new FormData(); formdata.append('file', upload_file)
建立负载 formData 对象的请求发送至服务器,服务器收到 formData 对象后为其开辟空间。code
文件二进制流转文件下载的方法:orm
向服务器发送返回类型 Blob 对象的请求,并获取到文件的二进制 Blob 对象。对象
// headerconfig xhr.responsetype = blob;
建立 FileReader 对象读取 Blob 对象,并经过a标签下载。blog
let reader = new FileReader(); reader.readAsDataURL(Blob); // 转换为base64,直接放入a标签href reader.onload = function(e) { // 转换完成,建立一个a标签用于下载 let a = document.createElement('a'); a.download = fileName; a.href = e.target.result; document.body.appendChild(a); // 修复firefox中没法触发click a.click(); document.body.removeChild(a);
向服务器发送返回类型 Blob 对象的请求,并获取到文件的二进制 Blob 对象。
// headerconfig xhr.responsetype = blob;
经过 Blob 对象和 msSaveBlob(blob, fileName) 以本地方式保存文件
if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName); }
向服务器发送返回类型 Blob 对象的请求,并获取到文件的二进制 Blob 对象。
// headerconfig xhr.responsetype = blob;
objectUrl = window.URL.createObjectURL(blob)建立新的URL表示指定Blob对象 a = document.createElement('a')建立a标签 a.href = objectUrl指定下载连接 a.download = fileName指定下载文件名 a.click()触发下载 a.remove()除a标签 window.URL.revokeObjectURL(objectUrl)释放