vue批量下载图片

需求

管理后台需要批量导出选中的图片
在这里插入图片描述
在这里插入图片描述

实现难点

选择相应的图片批量导出或直接批量导出并压缩在一个文件夹里

思路分析

1.先将选中二维码的地址存在一个数组中
2.依次请求图片并将其下载
3.后用jszip压缩文件
4.最后用file-saver生成文件

实现代码

import axios from 'axios'
import JSZip from 'jszip'
import FileSaver from 'file-saver'

methods: {
	// 赛选出选中的图片
	downloadImgAll () {
      let arr = [] //将图片地址存入该数组
      this.InforList.forEach(element => { // 获取到的所有图片
        this.listArr.forEach(item => { // 选中图片的id
          if (element.id == item) {
          //RealmName 这个是动态获取的域名
          //imgPath 图片地址
            arr.push(this.RealmName + element.imgPath)
          }
        })
      })
      this.async(arr)
    },
	// 批量下载
    async (selectImgList) {
      const data = selectImgList;
      const zip = new JSZip()
      const cache = {}
      const promises = []
      data.forEach(item => {
        const promise = this.getFile(item).then(data => { // 下载文件, 并存成ArrayBuffer对象
          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'
          // }
          zip.file(file_name, data, {
            binary: true
          }) // 逐个添加文件
          cache[file_name] = data
        })
        promises.push(promise)
      })
      Promise.all(promises).then(() => {
        zip.generateAsync({
          type: "blob"
        }).then(content => { // 生成二进制流
          FileSaver.saveAs(content, "photo.zip") // 利用file-saver保存文件
        })
      })
    },
    // 下载文件
    getFile (url) {
      return new Promise((resolve, reject) => {
        axios({
          method: 'get',
          url,
          responseType: 'arraybuffer'
        }).then(data => {
          resolve(data.data)
        }).catch(error => {
          reject(error.toString())
        })
      })
    }

}

知识点总结

1.插件file-saver的使用
  • a标签download属性下载不了跨域图片直接在浏览器预览,利用file-saver将跨域访问的图片下载
  • 可以file-saver下载其他文件,详情可去参考其API
  • 如果你需要保存较大的文件,不受 blob 的大小限制或内存限制,可以看一下更高级的 StreamSaver.js
2.插件jszip的使用
  • 点击批量下载所有图片都在浏览器下载文件多表现不友好,需将批量下载的图片打包进压缩包里,故引进了JSZip进行打包
  • JSZip是一个用于创建,阅读和编辑.zip文件的JavaScript库,具有友好而简单的API,详细用法可以参照其API

备注 :

  1. 注意的是responseType, 如果下载文件是文本类型的(如: .txt, .js之类的),那么用responseType: 2. 'text’也可以, 但是如果下载的文件是图片, 视频之类的, 就得用arraybuffer
  2. 如果下载的文件过大, 打包的时间将会很长, 甚至可能会导致浏览器奔溃
  3. 还需要注意的一点是请求图片资源时因其是异步请求,需要等所有图片请求完再进行打包这一步,在请求资源时需要await
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Vue 是一款非常流行的前端框架,其具有的优秀特性使得它成为前端开发者们的首选。对于 Vue 批量下载图片到本地这个问题,可以使用以下步骤进行实现: 1. 首先,需要在 Vue 组件中准备好一个列表,列表中存放着要下载图片的链接地址。 2. 确认图片是否需要在服务端下载。如果是需要在服务端下载,那么需要在 Vue 组件中调用服务端 API 异步获取图片链接,并将图片链接存放在之前准备好的图片链接列表中。 3. 如果图片链接已经准备好,那么就可以开始下载图片。可以使用 HTML5 的下载功能或者使用 axios 库进行下载,将每张图片下载到本地。 4. 在下载图片时,需要考虑的一些问题:如果下载量很大,那么需要分批次下载,防止下载过多过于占用网络资源;此外,需要设置下载进度条,让用户可以看到下载的进度和状态。 总之,Vue 批量下载图片到本地是一个相对比较简单的任务,关键是要掌握好下载过程的流程,处理好各种异常情况,以保证下载任务的顺利完成。同时,在实现该功能时,需要注意并合理利用 Vue 库内部提供的相关函数和方法,以提高开发效率和代码的精简程度。 ### 回答2: 在Vue中实现批量下载图片到本地可以通过创建一个按钮来触发下载功能。以下是具体的实现步骤: 1. 在Vue组件中,先引入所需的图片: ``` <template> <div> <img v-for="(image, index) in images" :key="index" :src="image.url"> <button @click="downloadImages">下载图片</button> </div> </template> <script> export default { data() { return { images: [ { url: '图片1的地址' }, { url: '图片2的地址' }, { url: '图片3的地址' }, // 在此处继续添加图片的地址... ] } }, methods: { downloadImages() { this.images.forEach((image) => { this.downloadImage(image.url); }); }, downloadImage(url) { const link = document.createElement('a'); link.href = url; link.download = '图片文件名.jpg'; // 可根据自己的需求来命名文件名 link.target = '_blank'; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } } } </script> ``` 2. 在上述代码中,创建了一个按钮,并绑定了一个`downloadImages`方法来触发下载操作。这个方法遍历所有的图片,并将每个图片的地址传给另一个`downloadImage`方法。 3. 在`downloadImage`方法中,通过使用`document.createElement('a')`来创建一个`<a>`元素,并设置其`href`属性为要下载图片地址,`download`属性为要保存的文件名,`target`属性为`_blank`表示在新标签页中打开,`style.display = 'none'`来隐藏这个`<a>`元素。 4. 然后将这个`<a>`元素添加到`document.body`中,模拟点击这个隐藏的链接,实现下载文件的效果。最后将这个`<a>`元素从`document.bod`y中移除。 5. 至此,当点击按钮时,所有图片都会被下载到本地。记得根据自己的需求来替换代码中的图片地址和文件名。 ### 回答3: 在Vue批量下载图片到本地可以使用以下步骤: 1. 首先,确保你的Vue项目已经安装了axios库,可以使用`npm install axios`命令来进行安装。 2. 在Vue组件中创建一个方法来处理下载图片的逻辑。例如,可以在methods中创建一个名为`downloadImages`的方法。 3. 在`downloadImages`方法中,使用axios的get方法来获取图片的二进制数据。可以使用一个包含图片URL的数组来遍历下载所有的图片。 4. 使用Blob对象将获取到的二进制数据转换成一个可下载的文件。如果需要给下载图片重命名,可以为生成的Blob对象创建一个新的File对象。 5. 创建一个a标签并设置其href属性为生成的Blob对象的URL,同时设置download属性为下载文件的名称。然后将a标签添加到DOM树中。 6. 使用JavaScript的click方法模拟点击a标签来触发下载。 下面是一个示例的代码片段: ``` <template> <div> <button @click="downloadImages">下载图片</button> </div> </template> <script> import axios from 'axios'; export default { methods: { downloadImages() { const imageUrls = [ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg' ]; imageUrls.forEach((url, index) => { axios.get(url, { responseType: 'blob' }) .then(response => { const blob = new Blob([response.data]); const file = new File([blob], `image${index + 1}.jpg`); const url = window.URL.createObjectURL(file); const link = document.createElement('a'); link.href = url; link.download = file.name; document.body.appendChild(link); link.click(); window.URL.revokeObjectURL(url); }) .catch(error => { console.error('下载失败:', error); }); }); } } } </script> ``` 这样,当用户点击下载图片按钮时,Vue组件会依次下载所有的图片到本地。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值