图片导出

前言

将图片以多级目录的形式导出。

实现

从服务端获取到图片数据后,对数据进行处理。得到下面格式:

js 复制代码
<div @click="exportImage">导出</div>

function exportImage() {
   //从服务端获取图片
  ProjectService.projectBasicInformationByProjectId('2ddQ5JcXNcX').then((res) => {
    let list = res.fileList;
    let opts = {
      zipName: '照片',
      subDirectory: [
        {
          fileName: '种植规划',
          pics: [
            {
              url: list[0].url,
              name: '种植规划1.jpg'
            },
            {
              url: list[1].url,
              name: '种植规划2.jpg'
            },
          ]
        },
      ]
    }
    exportImagesByZip(opts)
  });

}
js 复制代码
import JSZip from "jszip";
import { saveAs } from 'file-saver';
import { useMessage } from "naive-ui";
import { buildUrl } from "~/src/config";

export async function exportImagesByZip(opts) {
  const message = useMessage();
  let { subDirectory, zipName } = Object.assign({
    subDirectory: [],
    zipName: '照片',
  }, opts)
  if (subDirectory.length == 0) {
    message.warning('暂无数据')
    return;
  }
  const promises = [];
  const zip = new JSZip();
  //创建一级目录的压缩包
  const folder = zip.folder(`${zipName}`);
  //创建下级目录
  await subDirectory.forEach(item => {
    let subFolder = folder.folder(`${item.fileName}`);
    //生成镇下的文件
    if (item.pics.length == 0) return;
    item.pics.forEach(item => {
    const promise = new Promise(async (resolver, reject) => {
      let blob = await getImgBlobByUrl(buildUrl(item.url))
      subFolder.file(item.name, blob);
      resolver();
    })
    promises.push(promise);
    })
  })
  Promise.all(promises).then(() => {
    zip.generateAsync({ type: "blob" }).then(function (content) {
      saveAs(content, `${zipName}.zip`); // 下载压缩包
    });
  })
}

async function getImgBlobByUrl(url) {
  try {
    const response = await fetch(url);
    console.log(response);
     // 使用fetch请求图片
    const blob = await response.blob(); // 将响应转换为Blob对象
    return blob;
  } catch (error) {
    console.error('图片转换为Blob失败', error);
  }
}
相关推荐
karshey2 分钟前
【前端】解决:点击一个button,发现不触发点击事件
前端
用泥种荷花3 分钟前
【前端学习AI】Function Calling
前端
2301_796512528 分钟前
ModelEngin平台开发工作流,“前端职业导航师”通过直观的图形化界面,让用户像“搭积木”一样,轻松串联各种智能节点
前端·modelengine
Aotman_17 分钟前
JavaScript MutationObserver用法( 监听DOM变化 )
开发语言·前端·javascript·vue.js·前端框架·es6
酷柚易汛30 分钟前
酷柚易汛ERP 2025-12-26系统升级日志
java·前端·数据库·php
Onlyᝰ33 分钟前
前端调用接口进行上传文件
前端
90后的晨仔34 分钟前
2025,我的“AI搭子”:那个我以为用不上的AI,成了我每天都离不开的搭档!!
前端
hashiqimiya44 分钟前
JavaScript的object的使用和监控打印日志
前端·javascript·vue.js
颜酱44 分钟前
从0到1实现通用微任务调度器:理解前端异步调度核心
前端
C_心欲无痕2 小时前
vue3 - useId生成唯一标识符
前端·javascript·vue.js·vue3