基于blob对象,模拟a标签,实现下载文件

1.请求头设置responseType

headers:{
   'responseType': "blob"
 },

2.在组件中调用

//调用方法,获取后台返回的二进制数据流
this.operateRecordLoad().then((res)=>{
	/**
	生成blob对象
	拼接\uFEFF避免中文乱码问题(也可以由后端配置好,则不用拼接\uFEFF),
	设置文件格式,不设置默认为txt
	**/
   let blob = new Blob(['\uFEFF'+res],{type: "application/vnd.ms-excel;chartset=utf-8"});
   
   //创建a标签
   let link = document.createElement('a');
   let objectUrl = URL.createObjectURL(blob);
   //将a标签的href指向数据流
   link.setAttribute("href",objectUrl);
   let fileName = 'export-'+ new Date().getTime() + '.csv'
   //设置a标签的download属性,及文件名
   link.setAttribute("download",fileName); 
   //触发a标签点击
   link.click();
   //释放blob对象,避免内存溢出
   window.URL.revokeObjectURL(link.href)
 })

blob实例对象:
在这里插入图片描述

### 关于Web应用中`<a>`标签下载文件的问题 #### `<a>`标签下载功能局限性 对于某些类型的文件,浏览器可能不会触发下载行为而是直接尝试打开这些资源。例如,像txt、png、jpg、gif这样的常见媒体格式会被视为可以直接展示的内容而非附件[^1]。 #### URL长度与编码挑战 使用URL来传递参数时可能会遇到长度上的限制,并且如果URL中含有特殊字符,则需注意对其进行恰当的解码操作,比如利用JavaScript中的`decodeURIComponent()`函数处理编码问题。 #### HTTP头部缺失影响安全性 通过简单的HTML超链接方式发起请求的话,是没有办法附加额外HTTP头信息到服务器端去验证身份或者其他用途的;这意味着在这种情况下无法实施基于Header的身份认证机制。 #### 实现可靠的文件下载方法 为了确保文件能被正确识别并作为附件下载而不是在线查看,可以在构建页面时采用如下策略: - **设置正确的MIME类型**:服务端应该返回适合该种文档形式的Content-Type响应头。 - **指定`download`属性**:给定一个带有适当值(通常是建议保存下来的文件名)的`download`特性至锚点元素上,这有助于指示浏览器应将目标当作要下载对象对待。 ```html <a href="path/to/file.pdf" download="example.pdf">Download PDF</a> ``` - **确认相对路径的有效性**:确保所提供的href指向的是有效的本地或远程地址,在Vue.js框架下开发的应用里尤其要注意这一点,因为路由模式的不同可能导致实际访问路径有所变化[^4]。 - **考虑跨域资源共享(CORS)**:如果是从不同源获取数据,那么还需要关注CORS政策是否允许此类交互发生。 #### 使用Blob对象动态创建下载链接 另一种更灵活的方法是在客户端先取得二进制流再转换成Blob对象之后生成临时性的<a>节点来进行点击模拟从而完成整个过程: ```javascript fetch('https://api.example.com/getfile') .then(response => response.blob()) .then(blob => { const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; // 设置下载后的文件名称 a.download = "desired-filename.ext"; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); // 清理内存 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值