经过修改 HTTP 响应头,告诉浏览器这个请求回来的是个附件。以七牛为例子:html
这里须要注意两处:前端
Content-disposition
是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。Access-Control-Allow-Origin
跨域资源共享设置<a>
的 download
属性<a href="/path/to/img" download="name.png">下载图片</a>
抛开浏览器兼容性,还有几点限制:chrome
href
所指向的地址,必须与当前网站同源,不然canvas
<a>
并设置 download
属性原理和限制同上,代码以下:(不支持IE)跨域
function download(url, name) { const aLink = document.createElement('a') aLink.download = name aLink.href = url aLink.dispatchEvent(new MouseEvent('click', {})) }
以导出 canvas 图片为例:浏览器
<canvas id="canvas"></canvas>
const canvas = document.getElementById('canvas') download(canvas.toDataURL('image/png'), 'name.png')
<frame>
网上有不少文章都提到这个方案,可是这里不推荐:dom
document.execCommand('SaveAs')
中 SaveAs
是个非标准值,主要用来兼容 ie 不支持 <a>
标签 download
属性的场景window.frames["iframeName"].document
受到同源策略的影响,若是图片地址跨域,是没法访问的 <frame>
的属性和方法