图片导出

前言

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

实现

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

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);
  }
}
相关推荐
止观止21 小时前
XSS 攻击详解:原理、类型与防范策略
前端·xss
用户479492835691521 小时前
用|运算符写管道?Symbol.toPrimitive让JavaScript提前用上|>语法
前端·javascript
知识分享小能手1 天前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app
文心快码BaiduComate1 天前
限时集福!Comate挂件/皮肤上线,符(福)气掉落中~
前端·后端·程序员
勇敢di牛牛1 天前
vue3 + mars3D 三分钟画一个地球
前端·vue.js
IT_陈寒1 天前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
袁煦丞1 天前
MoneyPrinterTurbo一键生成短视频:cpolar内网穿透实验室第644个成功挑战
前端·程序员·远程工作
代码小学僧1 天前
让 AI 真正帮你开发:前端 MCP 实用技巧分享
前端
晴殇i1 天前
前端鉴权新时代:告别 localStorage,拥抱更安全的 JWT 存储方案
前端·javascript·面试
Json____1 天前
使用node Express 框架框架开发一个前后端分离的二手交易平台项目。
java·前端·express