HTML+JS實現(xiàn)瀏覽器下載圖片

如果使用a標簽指向一個圖片的話徒扶,你會發(fā)現(xiàn)點擊鏈接時它會直接在瀏覽器中打開圖片并顯示:

<a  />

但是這樣的話绎晃,就存在一個問題赁豆,如果我想點擊a鏈接直接下載圖片到本地波附,該怎么實現(xiàn)呢艺晴?
在查閱資料之后,發(fā)現(xiàn)a標簽有一個download的屬性掸屡,添加了該屬性封寞,a標簽將直接下載文件,并根據(jù)download屬性的值設(shè)置下載文件的文件名仅财,不為download屬性設(shè)置值則文件將以默認文件名下載:

<!-- 文件名為默認名稱 -->
<a href="./baidu_jgylogo3.gif" download />
<!-- 文件名為baidu.gif -->
<a href="./baidu_jgylogo3.gif" download="baidu" />
<!-- 文件名為baidu.png -->
<a href="./baidu_jgylogo3.gif" download="baidu.png" />

但是這個辦法有一個弊端狈究,它僅支持同源鏈接下載,非同源鏈接還是會直接打開圖片:

<!-- 同源鏈接能下載圖片 -->
<a href="./baidu_jgylogo3.gif" download />
<!-- 非同源鏈接download屬性會無效盏求,瀏覽器會直接打開圖片 -->
<a  download />

嘗試了將圖片轉(zhuǎn)成Base64或者Blob的辦法:

function downloadImgByBlob(url) {
    var img = new Image()
    img.onload = function() {
        var canvas = document.createElement('canvas')
        canvas.width = img.width
        canvas.height = img.height
        var ctx = canvas.getContext('2d')
        // 將img中的內(nèi)容畫到畫布上
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
        // 將畫布內(nèi)容轉(zhuǎn)換為Blob
        canvas.toBlob((blob) => {
            // blob轉(zhuǎn)為同源url
            var blobUrl = window.URL.createObjectURL(blob)
            // 創(chuàng)建a鏈接
            var a = document.createElement('a')
            a.href = blobUrl
            a.download = ''
            // 觸發(fā)a鏈接點擊事件抖锥,瀏覽器開始下載文件
            a.click()
        })
    }
    img.src = url
    // 必須設(shè)置亿眠,否則canvas中的內(nèi)容無法轉(zhuǎn)換為blob
    img.setAttribute('crossOrigin', 'Anonymous')
}

function downloadImgByBase64(url) {
    var img = new Image()
    img.onload = function() {
        var canvas = document.createElement('canvas')
        canvas.width = img.width
        canvas.height = img.height
        var ctx = canvas.getContext('2d')
        // 將img中的內(nèi)容畫到畫布上
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
        // 將畫布內(nèi)容轉(zhuǎn)換為base64
        var base64 = canvas.toDataURL()
        // 創(chuàng)建a鏈接
        var a = document.createElement('a')
        a.href = base64
        a.download = ''
        // 觸發(fā)a鏈接點擊事件,瀏覽器開始下載文件
        a.click()
    }
    img.src = url
    // 必須設(shè)置磅废,否則canvas中的內(nèi)容無法轉(zhuǎn)換為base64
    img.setAttribute('crossOrigin', 'Anonymous')
}

上述兩種方法效果都不太理想纳像。因為這兩種方法僅支持生成jpeg和png格式圖片。如果是gif圖拯勉,僅能顯示第一幀的內(nèi)容竟趾。
后來在download.js官網(wǎng)中看到了如下的示例:

var x=new XMLHttpRequest();
    x.open("GET", "http://danml.com/wave2.gif", true);
    x.responseType = 'blob';
    x.onload=function(e){download(x.response, "dlBinAjax.gif", "image/gif" ); }
    x.send();

該示例的思路是,通過XMLHttpRequest()請求圖片鏈接谜喊,然后獲取返回的Blob潭兽。那結(jié)合上面下載圖片的方法,就能下載圖片了:

var x=new XMLHttpRequest();
    x.open("GET", "http://danml.com/wave2.gif", true);
    x.responseType = 'blob';
    x.onload=function(e){
        var url = window.URL.createObjectURL(x.response)
        var a = document.createElement('a');
        a.href = url
        a.download = ''
        a.click()
    }
    x.send();

通過這種方法下載圖片斗遏,gif圖也能夠顯示正常了山卦。
注意,上述方法能夠兼容大部分瀏覽器诵次,但是不兼容IE瀏覽器(不支持download屬性)账蓉。要兼容IE瀏覽器需要用其他辦法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逾一,一起剝皮案震驚了整個濱河市铸本,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遵堵,老刑警劉巖箱玷,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陌宿,居然都是意外死亡锡足,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門壳坪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舶得,“玉大人,你說我怎么就攤上這事爽蝴°迮” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵蝎亚,是天一觀的道長九孩。 經(jīng)常有香客問我,道長发框,這世上最難降的妖魔是什么捻撑? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上顾患,老公的妹妹穿的比我還像新娘番捂。我一直安慰自己,他們只是感情好江解,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布设预。 她就那樣靜靜地躺著,像睡著了一般犁河。 火紅的嫁衣襯著肌膚如雪鳖枕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天桨螺,我揣著相機與錄音宾符,去河邊找鬼。 笑死灭翔,一個胖子當著我的面吹牛魏烫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肝箱,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼哄褒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了煌张?” 一聲冷哼從身側(cè)響起呐赡,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骏融,沒想到半個月后链嘀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡档玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年怀泊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窃肠。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刷允,靈堂內(nèi)的尸體忽然破棺而出冤留,到底是詐尸還是另有隱情,我是刑警寧澤树灶,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布纤怒,位于F島的核電站,受9級特大地震影響天通,放射性物質(zhì)發(fā)生泄漏泊窘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烘豹。 院中可真熱鬧瓜贾,春花似錦、人聲如沸携悯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憔鬼。三九已至龟劲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轴或,已是汗流浹背昌跌。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照雁,地道東北人蚕愤。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像囊榜,于是被迫代替她去往敵國和親审胸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5卸勺? 答:HTML5是最新的HTML標準砂沛。 注意:講述HT...
    kismetajun閱讀 27,474評論 1 45
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,748評論 1 92
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,182評論 0 3
  • 人死后會經(jīng)歷鬼門關(guān)曙求,黃泉路碍庵,奈何橋,忘川河悟狱,然后重入輪回静浴。 她與他約定,他們不喝那孟婆湯挤渐,要生生世世不相忘...
    北巷南貓閱讀 414評論 2 3
  • 我敬往事一杯酒苹享, 再苦再澀也入喉。 以此開解我煩憂浴麻, 或許可銷萬古愁得问。
    花飄水流閱讀 248評論 1 2