吃西瓜
现成的粒子
二进制流,是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同,
二进制文件可以包含任意类型的数据,例如:图像、音频、视频、可执行文件、压缩文件等,而文本文件则仅仅包含 ASCII 码或其他编码的字符数据。
- 常见的: ‘Blob、ArrayBuffer、File、FileReader 和 FormData’
- 在浏览器中长这样:
blobType
指的是,服务端返回的 Content-Type
中mine-type
,
常用的excel类型一般有2种:application/vnd.ms-excel
或 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
如:
javascript">
export const filmOrderExcelOut = (parameter: Record<any, any>) => {return request({method: 'post',url: Api.filmOrderExcelOut,data: parameter,responseType: 'blob' `【一定得加这个】`})
}--------------------------------------------------------------------// 导出表格
const exportExcel = async () => {try {let { data } = await orderApi.filmOrderExcelOut(searchParams.value)let blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })let file = new File([blob], '订单.xlsx', {lastModified: new Date() as any,type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})// console.log('file=', file)const a = document.createElement('a')a.style.display = 'none'document.body.appendChild(a)const url = URL.createObjectURL(file)a.href = urla.download = file.namea.click()// 清理document.body.removeChild(a)URL.revokeObjectURL(url)} catch (error) {message.error('网络请求发送失败~')}
}
出错的地方
- 问题:成功将文件流转换成了excel文件,并下载了,但是
下载后的文件打不了
!!! - 原因:就是因为请求接口时,少了这个
responseType: 'blob'
配置项
javascript">export const filmOrderExcelOut = (parameter: Record<any, any>) => {return request({method: 'post',url: Api.filmOrderExcelOut,data: parameter,responseType: 'blob' `【一定得加这个】`})
}`responseType`:表示,服务器响应的数据类型,可以是 'arraybuffer','blob','document','json','text','stream'等
- arraybuffer:设置响应类型为二进制对象【返回的是一个包含二进制数据的 JavaScript ArrayBuffer 类型化数组】
- blob:设置响应类型为二进制对象【返回的是一个包含二进制数据的 Blob 对象】
- document: 设置响应类型为html document 或 xml document,具体根据接收到的数据的 MIME 类型而定
- json: 设置响应类型为json类型,日常开发中常用
- text:设置响应类型为text文本类型