前言最近在写项目的时候,遇到后台请求文件时,后台返回传输文件格式为二进制流的情况。借此机会了解文件二进制上传/读取的机制。文件二进制传输的Blob对象Blob对象表示一个不可变的、类似原始数据的文件对象,可以作为二进制文件存储的容器。Blob对象可以通过构造函数来构造。varblob=newBlob(数组[可选],选项[可选]);//第一个参数:数据序列,可以是任意格式的值,//例如任意数量的字符串,Blobs和ArrayBuffers//前两个参数:用于指定要放入的数据类型斑点。Blob对象的基本属性:size:Blob对象中包含的字节数。(只读)类型:Blob对象中包含的数据类型,如果类型未知,则为空字符串。文件二进制传输的上传通过formData对象实现二进制文件的异步上传。创建一个空的FormData对象,并将文件对应的键/值对添加到FormData对象中。varformData=newFormData();formdata.append('file',upload_file)创建加载formData对象的请求发送给服务器,服务器收到后为formData对象开辟空间。FileBinaryTransferDownloadFileBinaryStreaming文件下载方式:通过fileReader对象异步读取二进制文件通过Blob对象和msSaveBlob(blob,fileName)将文件保存到本地通过createObjectURL将Blob对象指向一个URL,然后赋值给atag通过fileReader对象实现二进制文件的异步读取,向服务器发送请求返回一个Blob对象,获取文件的二进制Blob对象。//headerconfigxhr.responsetype=blob;创建FileReader对象读取Blob对象,通过a标签下载。让阅读器=新文件阅读器();reader.readAsDataURL(Blob);//转换成base64,直接放入taghrefreader.onload=function(e){//转换完成,创建一个atag用于下载leta=document.createElement('a');a.download=文件名;a.href=e.target.result;文档.body.appendChild(a);//修复firefox无法触发点击a.click();文件.body.removeChild(a);通过Blob对象在本地保存文件,并通过msSaveBlob(blob,fileName)向服务器发送请求返回类型Blob对象,得到文件的二进制Blob对象。//headerconfigxhr.responsetype=blob;通过Blob对象和msSaveBlob(blob,fileName)在本地保存文件if(window.navigator.msSaveOrOpenBlob){navigator.msSaveBlob(blob,fileName);}将Blob对象指向AURL,然后赋值给a标签向服务器发送请求返回类型Blob对象,得到文件的二进制Blob对象。//headerconfigxhr.responsetype=blob;objectUrl=window.URL.createObjectURL(blob)新建一个URL表示指定Blob对象a=document.createElement('a')新建一个标签a.href=objectUrl指定下载链接a。download=fileName指定下载文件名a.click()触发下载a.remove()移除一个标签window.URL.revokeObjectURL(objectUrl)发布参考JS:Blob()转换二进制下载文件流实例(CSDN论坛)JavaScriptBlob对象(掘金)
