經過修改 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>
的屬性和方法