需求背景:一个弹框,上面是图片,下面是按钮,按钮上文案为下载图片,点击按钮可以将图片下载到本地
解决方案:
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要设置宽高,否则是默认的尺寸,海报展示不全
上面的代码中使用了 naturalWidth 和 naturalHeight,这是 HTML5 新增的属性,它们可以直接获取图片的原始宽高