How to download, zip and save multiple files with Javascript and get progress?

前端 未结 3 850
甜味超标
甜味超标 2020-12-29 17:30

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

3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-29 18:03

    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'])
    

提交回复
热议问题