前端下载文件,下载图片和pdf新标签中打开,下载二进制流,canvas图片跨域
对于静态服务的文件一般可以通过a标签+download属性来下载, 但是如果文件是图片,pdf,html等浏览器支持解析的,而且是当前文件是跨域的,那么浏览器就会在新标签中打开。
<a download="" href='***'>下载</a>
- 文件不跨域 => 下载
- 文件跨域 + 浏览器不支持解析 => 下载
- 文件跨域 + 浏览器可以解析 => 新标签中打开
如果是后端返回的二进制流,可以通过ObjectURL进行下载(同时可以解决跨域img,pdf等新标签打开的问题和canvas图片跨域问题)
function downloadFile(url){
const xhr = new XMLHttpRequest();
xhr.open('GET',url)
xhr.responseType = 'blob'
xhr.send()
xhr.onload = function(){
const res = xhr.response
const fileUrl = URL.createObjectURL(res)
const eleA = document.createElement('a')
eleA.setAttribute('href',fileUrl)
eleA.setAttribute('download','')
eleA.click()
URL.revokeObjectURL(fileUrl)
// window.open(fileUrl) // 同样可新标签中打开进行预览
// img.src=fileUrl // 设置为img标签src
}
}
为什么Object URL可以解决canvas跨域问题(也可以通过crossOrgin解决),因为Object URL生成的是非跨域的URL.
<img src="blob:http://127.0.0.1:8887/db072d13-60d1-40b7-887b-6dd7ea8e883a" alt="">
这篇文章内容比较少也比较基础,因为连续有人问到,简单记录一下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?