I\'m creating a Chrome extension that needs to download multiple files (images and/or videos) from a website. These files may have a huge size, so I want to show the downloa
import JSZip from 'jszip'
import JSZipUtils from 'jszip-utils'
import FileSaver from 'file-saver'
const async downloadZip = (urls) => {
const urlToPromise = (url) => {
return new Promise((resolve, reject) => {
JSZipUtils.getBinaryContent(url, (err, data) => {
if (err) reject(err)
else resolve(data)
})
})
}
const getExtension = (binary) => {
const arr = (new Uint8Array(binary)).subarray(0, 4)
let hex = ''
for (var i = 0; i < arr.length; i++) {
hex += arr[i].toString(16)
}
switch (hex) {
case '89504e47':
return 'png'
case '47494638':
return 'gif'
case 'ffd8ffe0':
case 'ffd8ffe1':
case 'ffd8ffe2':
case 'ffd8ffe3':
case 'ffd8ffe8':
return 'jpg'
default:
return ''
}
}
this.progress = true
const zip = new JSZip()
for (const index in urls) {
const url = urls[index]
const binary = await urlToPromise(url)
const extension = getExtension(binary) || url.split('.').pop().split(/#|\?/)[0]
const filename = `${index}.${extension}`
zip.file(filename, binary, { binary: true })
}
await zip.generateAsync({ type: 'blob' })
.then((blob) => {
FileSaver.saveAs(blob, 'download.zip')
})
}
downloadZip(['https://example.net/1.jpg', 'https://example.net/some_picture_generator'])