2022-06-15 实现一个下载图片功能

需求背景:一个弹框,上面是图片,下面是按钮,按钮上文案为下载图片,点击按钮可以将图片下载到本地

解决方案:

1.使用原生a标签,加上download 属性,缺点是:如果图片跨域时,会直接新开一个窗口打开图片,而不是下载图片

2.借助base64实现任意文件下载

对于非文本文件,也是可以直接JS触发下载的,例如,如果我们想下载一张图片,可以把这张图片转换成base64格式,然后下载。

代码示例:


下载功能代码示例

火狐浏览器下载示例:

当eleLink.download = "",由于a标签的download设置为空,所以火狐浏览器下载的时候没有文件名,使用文件后缀为文件名了,这样用户直接点不开,

火狐浏览器下载示例

当image没有设置允许跨域的属性时,canvas会报错

Canvas 可以正常的渲染跨域图片,但是在跨域图片没有设置跨域响应头或没有设置 crossOrigin = 'anonymous' 的时候,使用 canvas.toDataURl 会抛出如下错误:

Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvases may not be exported.

设置这行代码即可:imageDom.setAttribute("crossOrigin",'anonymous')

canvas要设置宽高,否则是默认的尺寸,海报展示不全


设置canvas的宽高

上面的代码中使用了 naturalWidth 和 naturalHeight,这是 HTML5 新增的属性,它们可以直接获取图片的原始宽高

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容