图片转码下载方式(解决浏览器下载图片时直接打开图片问题)
应产品需求,需要将文件上传后再次点击上传列表中的文件实现文件下载功能
成功上传文件后,服务器会返回 (路径 + 文件名)格式的字符串,前端通过拼接上config.js文件中配置fls文件存储服务地址,获得完整的资源url进行模拟点击下载
问题点:浏览器在通过url请求资源,如果该资源文件格式支持浏览器直接预览的情况,就不会启动下载任务(此问题在新文件存储服务中不存在)
解决方案:需要将url获得的图通过canvas转码后,再通过点击事件打开浏览器下载任务,代码实现如下
downloadIamge(imgsrc, name) {//下载图片地址和图片名
let image = new Image()
// 解决跨域 Canvas 污染问题
image.setAttribute("crossOrigin", "anonymous")
image.onload = function () {
let canvas = document.createElement("canvas")
canvas.width = image.width
canvas.height = image.height
let context = canvas.getContext("2d")
context.drawImage(image, 0, 0, image.width, image.height)
let url = canvas.toDataURL("image/png") //得到图片的base64编码数据
let a = document.createElement("a") // 生成一个a元素
let event = new MouseEvent("click") // 创建一个单击事件
a.download = name || "photo" // 设置图片名称
a.href = url // 将生成的URL设置为a.href属性
a.dispatchEvent(event) // 触发a的单击事件
};
image.src = imgsrc;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
图片请求需要被canvas复用时,要求必须按照 CORS 来请求图片,故加了 crossorigin 属性,所以服务器必须加上字段Access-Control-Allow-Origin,否则会提示跨域,客户端设置了也是没用的
上次更新: 2024/01/18, 10:44:15