js實(shí)現(xiàn)多張圖片打包成zip
1、引入文件
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.6.0/jszip.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
2、html頁(yè)面
<button onclick="packageImages()">下載zip</button><span id="status"></span>
3、主要代碼
function packageImages() {
$('#status').text('處理中。。。。。')
var imgsSrc = []
// https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2496571732,442429806&fm=26&gp=0.jpg
// https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2151136234,3513236673&fm=26&gp=0.jpg
for (var i = 0; i < 1; i++) {
imgsSrc.push('https://img.alicdn.com/bao/uploaded/i1/446338500/O1CN01npzdZ52Cf3A4cx8JG_!!0-item_pic.jpg_240x240.jpg')
}
var imgBase64 = [] //base64圖片
var imageSuffix = [] //圖片后綴
var zip = new JSZip()
zip.file('readme.txt', '案件詳情資料\n')
var img = zip.folder('images')
for (var i = 0; i < imgsSrc.length; i++) {
var suffix = imgsSrc[i].substring(imgsSrc[i].lastIndexOf('.'))
imageSuffix.push(suffix)
getBase64(imgsSrc[i]).then(
function (base64) {
console.log(base64)
imgBase64.push(base64.replace(/^data:image\/(png|jpg|jpeg);base64,/, ""))
// 當(dāng)所有圖片轉(zhuǎn)成base64執(zhí)行圖片壓縮
if (imgsSrc.length == imgBase64.length) {
for (var i = 0; i < imgsSrc.length; i++) {
// 文件名 數(shù)據(jù)
img.file(i + imageSuffix[i], imgBase64[i], {
base64: true,
})
}
zip.generateAsync({
type: 'blob'
}).then(function (content) {
console.log(1)
// see FileSaver.js
saveAs(content, 'images.zip')
$('#status').text('處理完成。。。。。')
})
}
},
function (err) {
console.log(err) //打印異常信息
}
)
}
}
//傳入圖片路徑,返回base64
function getBase64(img) {
function getBase64Image(img, width, height) {
//width、height調(diào)用時(shí)傳入具體像素值,控制大小 ,不傳則默認(rèn)圖像大小
var canvas = document.createElement('canvas')
canvas.width = width ? width : img.width
canvas.height = height ? height : img.height
var ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
var dataURL = canvas.toDataURL()
return dataURL
}
var image = new Image()
image.crossOrigin = 'Anonymous'
image.src = img
var deferred = $.Deferred()
if (img) {
image.onload = function () {
deferred.resolve(getBase64Image(image)) //將base64傳給done上傳處理
}
return deferred.promise() //問(wèn)題要讓onload完成后再return sessionStorage['imgTest']
}
}
4、優(yōu)化圖片轉(zhuǎn)base64的流程,提高zip的打包速度
function packageImages() {
$('#status').text('處理中。。。。。')
var imgsSrc = []
// https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2496571732,442429806&fm=26&gp=0.jpg
// https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2151136234,3513236673&fm=26&gp=0.jpg
for (var i = 0; i < 1; i++) {
imgsSrc.push('https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2496571732,442429806&fm=26&gp=0.jpg')
}
var imgBase64 = [] //base64圖片
var imageSuffix = [] //圖片后綴
var zip = new JSZip()
zip.file('readme.txt', '案件詳情資料\n')
var img = zip.folder('images')
for (var i = 0; i < imgsSrc.length; i++) {
var suffix = imgsSrc[i].substring(imgsSrc[i].lastIndexOf('.'))
imageSuffix.push(suffix)
getBase64(imgsSrc[i], function (base64) {
imgBase64.push(base64.replace(/^data:image\/(png|jpg|jpeg);base64,/, ""))
if (imgsSrc.length == imgBase64.length) {
for (var i = 0; i < imgsSrc.length; i++) {
// 文件名 數(shù)據(jù)
img.file(i + imageSuffix[i], imgBase64[i], {
base64: true,
})
}
zip.generateAsync({
type: 'blob'
}).then(function (content) {
console.log(1)
// see FileSaver.js
saveAs(content, 'images.zip')
$('#status').text('處理完成。。。。。')
})
}
})
}
}
function getBase64(img, callback) {
fetch(img).then(
res => res.blob())
.then(res => {
let fr = new FileReader();//https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
fr.onload = function (e) {
callback(e.target.result)
};
fr.onerror = function () {
console.log('讀取錯(cuò)誤!')
};
fr.readAsDataURL(res);//如果是轉(zhuǎn)文字,第二個(gè)參數(shù)可以使用編碼
})
}
5、再優(yōu)化,通過(guò)axios把圖片轉(zhuǎn)成base64
function packageImages() {
$('#status').text('處理中。。。。。')
var imgsSrc = []
// https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2496571732,442429806&fm=26&gp=0.jpg
// https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2151136234,3513236673&fm=26&gp=0.jpg
for (var i = 0; i < 100; i++) {
imgsSrc.push('https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2496571732,442429806&fm=26&gp=0.jpg')
}
handleBatchDownload(imgsSrc)
}
getFile = (url) => {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url,
responseType: 'arraybuffer'
}).then(data => {
resolve(data.data)
}).catch(error => {
reject(error.toString())
})
})
};
// 批量下載
handleBatchDownload = async (selectImgList) => {
const data = selectImgList;
const zip = new JSZip()
const promises = []
await data.forEach((item, idx) => {
// console.log(item, idx)
const promise = this.getFile(item).then(async (data) => { // 下載文件, 并存成ArrayBuffer對(duì)象
const arr_name = item.split("/");
let file_name = arr_name[arr_name.length - 1] // 獲取文件名
// if (file_name.indexOf('.png') == -1) {
// file_name = file_name + '.png'
// }
await zip.file(idx + '.png', data, {
binary: true
}) // 逐個(gè)添加文件
})
promises.push(promise)
})
Promise.all(promises).then(() => {
zip.generateAsync({
type: "blob"
}).then(content => { // 生成二進(jìn)制流
saveAs(content, "photo.zip") // 利用file-saver保存文件
$('#status').text('處理完成。。。。。')
})
})
};
以上就是js實(shí)現(xiàn)多張圖片打包成zip的詳細(xì)內(nèi)容,更多關(guān)于js 圖片打包成zip的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript垃圾收集機(jī)制與內(nèi)存泄漏詳細(xì)解析
本文是對(duì)javascript中的垃圾收集機(jī)制與內(nèi)存泄漏進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
EditPlus中的正則表達(dá)式 實(shí)戰(zhàn)(4)
這篇文章主要介紹了 EditPlus中的正則表達(dá)式 實(shí)戰(zhàn)(4)的相關(guān)資料,需要的朋友可以參考下2016-12-12
JS新手入門(mén)數(shù)組處理的實(shí)用方法匯總
這篇文章主要給大家介紹了關(guān)于JS新手入門(mén)數(shù)組處理實(shí)用方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
原生js實(shí)現(xiàn)類(lèi)似fullpage的單頁(yè)/全屏滾動(dòng)
這篇文章主要介紹了利用原生js實(shí)現(xiàn)類(lèi)似fullpage的全屏滾動(dòng)的實(shí)現(xiàn)方法,文中給出了完整的實(shí)例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考價(jià)值,需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2017-01-01
layui實(shí)現(xiàn)數(shù)據(jù)分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了layui實(shí)現(xiàn)數(shù)據(jù)分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
解決layer 關(guān)閉當(dāng)前彈窗 關(guān)閉遮罩層 input值獲取不到的問(wèn)題
今天小編就為大家分享一篇解決layer 關(guān)閉當(dāng)前彈窗 關(guān)閉遮罩層 input值獲取不到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
JS實(shí)現(xiàn)超簡(jiǎn)潔網(wǎng)頁(yè)title標(biāo)題跑動(dòng)閃爍提示效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)超簡(jiǎn)潔網(wǎng)頁(yè)title標(biāo)題跑動(dòng)閃爍提示效果代碼,涉及JavaScript結(jié)合定時(shí)函數(shù)動(dòng)態(tài)操作頁(yè)面元素屬性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
利用js判斷數(shù)據(jù)是否是數(shù)組或字符串的常見(jiàn)方法
這篇文章主要給大家介紹了關(guān)于利用js判斷數(shù)據(jù)是否是數(shù)組或字符串的常見(jiàn)方法,其實(shí)有很多方法可以判斷數(shù)據(jù)是否是數(shù)組或字符串,需要的朋友可以參考下2023-07-07

