【web圖片批量下載到壓縮文件夾 】 使用到 jszip filesaver

最近項目中要實現(xiàn)圖片批量下載功能逸爵,最先用的cavas繪圖成base64批量下載圖片纽门,后來發(fā)現(xiàn)處理少量圖片可以用canvas繪圖没炒,下載圖片量太大會導(dǎo)致下載圖片緩慢更甚至性能不高的電腦會造成瀏覽器閃退浓领,所以這種方法行不通陶耍,代碼貼一下記錄一下:
方法一(不推薦):

downloadImage(imgsrc, name) {//下載圖片地址和圖片名
          let image = new Image();
          // 解決跨域 Canvas 污染問題
          image.setAttribute("crossOrigin", "Anonymous");
          image.onload = function() {
            let canvas = document.createElement("canvas");
            canvas.width = image.width;
            canvas.height = image.height;
            let context = canvas.getContext("2d");
            context.drawImage(image, 0, 0, image.width, image.height);
            let url = canvas.toDataURL("image/png"); //得到圖片的base64編碼數(shù)據(jù)
            let a = document.createElement("a"); // 生成一個a元素
            let event = new MouseEvent("click"); // 創(chuàng)建一個單擊事件
            a.download = name || "photo"; // 設(shè)置圖片名稱
            a.href = url; // 將生成的URL設(shè)置為a.href屬性
            a.dispatchEvent(event); // 觸發(fā)a的單擊事件
                a.remove()  //移除a標(biāo)簽
          };
          image.src = imgsrc;
        },

方法二:
后來嘗試使用xhr請求獲取blob數(shù)據(jù)奋蔚,多張圖片批量下載,一張圖片請求一次下載烈钞,后來發(fā)現(xiàn)原本要下載50張圖旺拉,下載后可能是25張产上?部分圖片貌似被瀏覽器吞了(也能是圖片命名相同導(dǎo)致瀏覽器認(rèn)為一樣的圖片沒必要重復(fù)下載棵磷,沒細(xì)查)....

方法三:
最后改變策略蛾狗,在方法二基礎(chǔ)上改造,第一步先使用xhr請求獲取blob數(shù)據(jù)仪媒,然后利用jsZip模塊把所有圖片文件都壓縮到一個文件中沉桌,壓縮后一次下載,發(fā)現(xiàn)下載的圖片是25個算吩,最后結(jié)合數(shù)組下綴改了不同文件名留凭,完美下載壓縮包,附代碼(前端框架使用element ui):
安裝模塊:

npm install jszip
npm install file-saver --save

引入模塊:

import JSZip from 'jszip';    //生成壓縮文件模塊
import FileSaver from "file-saver";    //保存文件模塊
getBlob(url,cb) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = function() {
        if (xhr.status === 200) {
            that.downCount++
            cb(xhr.response);
        }
    };

    xhr.send();
},
downFileSingle(){
    
    let item = this.downlist[this.requestQueueIndex-1]   //this.downlist下載文件列表
    let arr = item.path.split('.')
    let filename = '圖片名稱'+'.'+arr[arr.length-1]

    this.downFile(item.path,filename)
},

            downloadZip() {
                let that = this

                if(!this.downlist.length){
                this.$message({
                    type:'warning',
                    message:'請選擇要下載的圖片'
                })
                return
            }

            var zip = new JSZip();
            let appendFile = function(name, file) { //加入圖片
                    zip.file(name, file);
            }
            let downloadZip = function() { //下載zip
                    return new Promise((resolve, reject) => {
                            zip.generateAsync({
                                            type: "blob"
                                    })
                                    .then(function(content) {
                                            // see FileSaver.js
                                            FileSaver(content, `壓縮文件_${that.downlist.length}.zip`)
                                            that.downlist = []
                                            resolve();
                                    });
                    })
            }
            let getImageBlob = function(src) { //得到圖片的blob
                    return new Promise((resolve, reject) => {
                            var xhr = new XMLHttpRequest();
                            xhr.open("get", src, true);
                            xhr.responseType = "blob";
                            xhr.onload = function() {
                                    if(this.status == 200) {
                                            var blob = this.response;



                                            resolve(blob);
                                    }
                            }
                            xhr.onerror = function() {
                                    reject();
                            }
                            xhr.send();
                    });
            }
            this.loading = true;
            let arr = [];
            this.downlist.forEach((item, index) => {
                console.log(item)
                    arr.push(getImageBlob( that.$fly.config.IMG_URL + item.path).then(blob => {
                         let arr = item.path.split('.')
                    let filename =  '圖片名稱_' + index +'.'+arr[arr.length-1]
                            appendFile(filename, blob);
                    }).catch(err=>{
                        console.log(err)
                    })
                    );
            });
            Promise.all(arr).then(rs => {
                    downloadZip().then(rs => {
                            this.loading = false;
                    })
            }).catch(ex => {
                    this.loading = false;
            });
            
    },

此方法也可類比打包下載其它文件偎巢,jsZIp也有在線預(yù)覽壓縮文件功能蔼夜,具體見傳送門:http://www.reibang.com/p/e95718103e0a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市压昼,隨后出現(xiàn)的幾起案子求冷,更是在濱河造成了極大的恐慌,老刑警劉巖窍霞,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匠题,死亡現(xiàn)場離奇詭異,居然都是意外死亡但金,警方通過查閱死者的電腦和手機韭山,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冷溃,“玉大人钱磅,你說我怎么就攤上這事∷普恚” “怎么了盖淡?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菠净。 經(jīng)常有香客問我禁舷,道長,這世上最難降的妖魔是什么毅往? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任牵咙,我火速辦了婚禮,結(jié)果婚禮上攀唯,老公的妹妹穿的比我還像新娘洁桌。我一直安慰自己,他們只是感情好侯嘀,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布另凌。 她就那樣靜靜地躺著谱轨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吠谢。 梳的紋絲不亂的頭發(fā)上土童,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音工坊,去河邊找鬼献汗。 笑死,一個胖子當(dāng)著我的面吹牛王污,可吹牛的內(nèi)容都是我干的罢吃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼昭齐,長吁一口氣:“原來是場噩夢啊……” “哼尿招!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阱驾,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤就谜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啊易,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吁伺,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年租谈,在試婚紗的時候發(fā)現(xiàn)自己被綠了篮奄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡割去,死狀恐怖窟却,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呻逆,我是刑警寧澤夸赫,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站咖城,受9級特大地震影響茬腿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宜雀,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一切平、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辐董,春花似錦悴品、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽定枷。三九已至募壕,卻和暖如春据过,著一層夾襖步出監(jiān)牢的瞬間可岂,已是汗流浹背领炫。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留块请,地道東北人亡呵。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像絮供,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茶敏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者壤靶,不喜歡去冒險,但是人生放棄了冒險惊搏,也就放棄了無數(shù)的可能贮乳。 ...
    yichen大刀閱讀 6,033評論 0 4
  • 公元:2019年11月28日19時42分農(nóng)歷:二零一九年 十一月 初三日 戌時干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,870評論 0 2
  • 今天上午陪老媽看病,下午健身房跑步恬惯,晚上想想今天還沒有斷舍離向拆,馬上做,衣架和旁邊的的布衣架酪耳,一看亂亂浓恳,又想想自己是...
    影子3623253閱讀 2,905評論 1 8