前端知识框架 前端知识框架
首页
基础
框架
插件
Node
地图
更多
前端须知
  • 分类
  • 标签
  • 归档

BestIdea

首页
基础
框架
插件
Node
地图
更多
前端须知
  • 分类
  • 标签
  • 归档
  • 国产机环境浏览器兼容问题收集(持续收集)
  • canvas电子画板,适用于H5版本,组件产出为blob类型的文件流
  • Css3 filter(滤镜) 属性
  • css选择器
  • http缓存
  • less语法
  • New date()浏览器时间兼容性
  • rem自动适应性布局方案
  • 浏览器缓存机制
  • 屏幕适配
  • 前端基础方法汇总
  • 图片转码下载方式(解决浏览器下载图片时直接打开图片问题)
  • CSS命名规范
  • 大屏定位解决方案
  • TypeScript入门
  • 解决有些浏览器rem不以html的font-size为基准问题
  • 解决Vue项目页面缩放问题
  • H5扫一扫功能
  • crypto前端加密
  • 基础
姚宇
2022-03-26

图片转码下载方式(解决浏览器下载图片时直接打开图片问题)

应产品需求,需要将文件上传后再次点击上传列表中的文件实现文件下载功能

成功上传文件后,服务器会返回 (路径 + 文件名)格式的字符串,前端通过拼接上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

图片请求需要被canvas复用时,要求必须按照 CORS 来请求图片,故加了 crossorigin 属性,所以服务器必须加上字段Access-Control-Allow-Origin,否则会提示跨域,客户端设置了也是没用的

上次更新: 2024/01/18, 10:44:15
前端基础方法汇总
CSS命名规范

← 前端基础方法汇总 CSS命名规范→

最近更新
01
webpack打包替换类名命名空间
05-01
02
Vite常用配置
02-26
03
crypto前端加密
01-18
更多文章>
Theme by Vdoing | Copyright © 2022-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式