vue項(xiàng)目實(shí)現(xiàn)下載zip壓縮包
vue項(xiàng)目下載zip壓縮包
直接上代碼
1.請(qǐng)求后端接口
//必須加上responseType,因?yàn)橄螺d的zip屬于流和普通的下載方式還是有較大區(qū)別的,同時(shí)headers也需要設(shè)置一下,不然是下載不了。 export function loadLabel(query) { return request({ url: '/express/admin/loadLabel', method: 'get', params: query, responseType: 'blob', headers:{ 'Content-Type': 'application/json; application/octet-stream'}, }) }
2.HTML
<el-button size="mini" type="text" icon="el-icon-download" @click="handleIndent(scope.row)" v-hasPermi="['express:result:export']"> 下載失敗訂單 </el-button>
3.JS
//下載面單封裝方法 fileHandle(data, fileName) { let blob = new Blob([data], { type: 'application/zip' }) let url = window.URL.createObjectURL(blob) const link = document.createElement('a') // 創(chuàng)建a標(biāo)簽 link.href = url link.download = fileName // 重命名文件 link.click() URL.revokeObjectURL(url) // 釋放內(nèi)存 }, /** 下載面單 */ handleSheet(row){ this.queryParams.parentId=row.id, this.queryParams.statusCode=200 this.$confirm('是否確認(rèn)下載成功的面單嘛?', '提示', { confirmButtonText: '確定', cancelButtonText: '取消', type: 'warning' }).then(() => { const loading1= this.$loading({ lock: true, text: '正在下載,請(qǐng)稍等', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' }); loadLabel(this.queryParams).then(res => { loading1.close(); this.fileHandle(res,'面單.zip') }) }).catch(() => { }); },
當(dāng)然也可以不用封裝的方法
handleSheet(row){ this.queryParams.parentId=row.id, this.queryParams.statusCode=200 const queryparmas=this.queryParams this.$confirm("是否確認(rèn)導(dǎo)出所有數(shù)據(jù)?", "警告", { confirmButtonText: "確定", cancelButtonText: "取消", type: "warning", }).then(function() { return loadLabel(queryparmas); }).then(response => { let blob = new Blob([response.data], {type: 'application/zip'}) let url = window.URL.createObjectURL(blob) const link = document.createElement('a') // 創(chuàng)建a標(biāo)簽 link.href = url link.download = '面單.zip' // 重命名文件 link.click() URL.revokeObjectURL(url) // 釋放內(nèi)存 }).catch(function(err) { console.log(err) }); },
以上兩種形式的代碼就能實(shí)現(xiàn)zip下載
vue多文件下載zip格式
場(chǎng)景
多圖片時(shí),下載成一個(gè)zip壓縮包文件
代碼實(shí)現(xiàn)
1、安裝 jszip 和 file-saver 插件
npm install jszip npm install file-saver
2、引入并使用
import JSZip from "jszip"; import FileSaver from "file-saver"; /** * 下載全部附件 * @param {*} fileList 下載列表 * @param {*} zipName 壓縮包名稱 */ export function downloadMoreFileBtn(fileList, zipName) { var zip = new JSZip(); var promises = []; let cache = {}; for (let item of fileList) { // item.feilePath為文件鏈接地址 // item.fileName為文件名稱 if(item.imageUrl) { const promise = getImgArrayBuffer(item.imageUrl).then((data) => { // 下載文件, 并存成ArrayBuffer對(duì)象(blob) zip.file(item.imageName, data, { binary: true }); // 逐個(gè)添加文件 cache[item.imageName] = data; }); promises.push(promise); } else { // feilePath地址不存在時(shí)提示 alert(`附件${item.imageName}地址錯(cuò)誤,下載失敗`); } } Promise.all(promises).then(() => { zip.generateAsync({ type: "blob" }).then((content) => { // 生成二進(jìn)制流 FileSaver.saveAs(content, zipName); // 利用file-saver保存文件 zipName:自定義文件名 }); }).catch((res) => { alert("文件壓縮失敗"); }); } /** * 文件以流的形式獲取(參數(shù)url為文件鏈接地址) * @param {*} url * @returns */ export function getImgArrayBuffer(url) { return new Promise((resolve, reject) => { //通過(guò)請(qǐng)求獲取文件blob格式 let xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", url, true); xmlhttp.responseType = "blob"; xmlhttp.onload = function () { if (xmlhttp.status == 200) { resolve(xmlhttp.response); } else { reject(xmlhttp.response); } }; xmlhttp.send(); }); }
3、案例
import { downloadMoreFileBtn } from "@/utils/tools"; export default { data() { return { basicImage: { name: '使用功能基準(zhǔn)圖', imageCount: 2, imageList: [ { imageName: '使用功能基準(zhǔn)圖1.jpg', imageUrl: 'https://guoyan.haznet.cn/file/20230531100310f3u83t94wf.jpg', }, { imageName: '使用功能基準(zhǔn)圖2.jpg', imageUrl: 'https://guoyan.haznet.cn/file/20230531100340aqer06tma5.jpg', } ] }, } }, methods: { /** * 下載圖片 */ downloadImg(val) { downloadMoreFileBtn(this.basicImage.imageList, this.basicImage.name) }, }, }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue項(xiàng)目部署上線全過(guò)程記錄(保姆級(jí)教程)
vue項(xiàng)目開發(fā)完畢后,我們需要將項(xiàng)目打包上線,同時(shí)我們希望可以在本地預(yù)覽生產(chǎn)環(huán)境項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目部署上線的相關(guān)資料,需要的朋友可以參考下2023-03-03vue Cli 環(huán)境刪除與重裝教程 - 版本文檔
這篇文章主要介紹了vue Cli 環(huán)境刪除與重裝教程 - 版本文檔,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Vue3+Element?Plus使用svg加載iconfont的處理方法
這篇文章主要介紹了Vue3+Element?Plus使用svg加載iconfont的解決方案,本文詳細(xì)介紹了如何在Element?Plus中使用iconfont,簡(jiǎn)單的說(shuō)就是要將其封裝成SVG,并且支持動(dòng)態(tài)修改顏色,需要的朋友可以參考下2022-08-08解決Vue數(shù)據(jù)更新了但頁(yè)面沒有更新的問(wèn)題
在vue項(xiàng)目中,有些我們會(huì)遇到修改完數(shù)據(jù),但是視圖卻沒有更新的情況,具體的場(chǎng)景不一樣,解決問(wèn)題的方法也不一樣,在網(wǎng)上看了很多文章,在此總結(jié)匯總一下,需要的朋友可以參考下2023-08-08解讀element-ui使用el-upload,before-upload函數(shù)不好使的問(wèn)題
這篇文章主要介紹了解讀element-ui使用el-upload,before-upload函數(shù)不好使的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03ElementUI 修改默認(rèn)樣式的幾種辦法(小結(jié))
這篇文章主要介紹了ElementUI 修改默認(rèn)樣式的幾種辦法(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Vue Form表單的使用方法(rules格式校驗(yàn)網(wǎng)絡(luò)校驗(yàn)鍵盤按鍵監(jiān)聽)
本文介紹了在Vue.js中使用表單校驗(yàn)規(guī)則(rules)進(jìn)行網(wǎng)絡(luò)請(qǐng)求校驗(yàn)的方法,以及如何通過(guò)formRef引用表單對(duì)象并進(jìn)行鍵盤按鍵監(jiān)聽,感興趣的朋友跟隨小編一起看看吧2024-11-11