前端批量下载图片组件

简介

具有批量下载图片、打包压缩的能力,并且可以根据需要生成二维码

文件目录

在这里插入图片描述

代码

Batch.tsx

import { Button, type ButtonProps } from '@ali/ic-base-antd';
import { useMemoizedFn } from 'ahooks';
import axios from 'axios';
import { saveAs } from 'file-saver';
import JSZip from 'jszip';
import { useState, type FC } from 'react';
import { handleStrToQRLink } from './utils';

export type IBatchDownloadData = Array<{ url: string; name: string }>;

interface IBatchDownloadPictures extends ButtonProps {
  data: IBatchDownloadData;
  needToQRLink?: boolean;
  btnText?: string;
  saveName?: string;
  handleError?: (msg: string) => void;
  onSuccess?: () => void;
}

const BatchDownloadPictures: FC<IBatchDownloadPictures> = ({
  data,
  needToQRLink = false,
  saveName = '文件.zip',
  btnText = '批量下载',
  handleError,
  onSuccess,
  ...buttonProps
}) => {
  const [loading, setLoading] = useState(false);

  const getFileData = useMemoizedFn((fileUrl: string) => {
    return axios<Blob>(fileUrl, { method: 'get', responseType: 'blob' })
      .then((res) => {
        console.log('getFileData', res);
        return res.data;
      })
      .catch((e) => {
        console.log('err', e);
      });
  });

  const handleBatchDownLoad = useMemoizedFn(() => {
    if (!data?.length) {
      throw new Error('数据为空');
    }

    setLoading(true);
    const zip = new JSZip();
    const promises: Promise<void | Blob>[] = [];
    data.forEach((file) => {
      const url = needToQRLink ? handleStrToQRLink(file.url) : file.url;
      const promise = getFileData(url).then((res) => {
        if (res instanceof Blob) {
          // 转东八区
          const now = new Date();
          const localDateTime = new Date(
            now.getTime() - now.getTimezoneOffset() * 60000,
          );

          zip.file(`${file.name}.png`, res, {
            binary: true,
            date: localDateTime,
          });
        }
      });
      promises.push(promise);
    });

    Promise.all(promises)
      .then(() => {
        zip
          .generateAsync({
            type: 'blob',
            compression: 'DEFLATE',
            compressionOptions: {
              level: 9,
            },
          })
          .then((res) => {
            saveAs(res, saveName);
            onSuccess?.();
          })
          .catch((e: Error) => {
            const msg = e.message ?? '下载失败';
            handleError?.(msg);
            throw new Error(msg);
          });
      })
      .catch((e: Error) => {
        const msg = e.message ?? '网络错误';
        handleError?.(msg);
        throw new Error(msg);
      })
      .finally(() => {
        setLoading(false);
      });
  });

  return (
    <Button {...buttonProps} onClick={handleBatchDownLoad} loading={loading}>
      {btnText}
    </Button>
  );
};

export default BatchDownloadPictures;

utils.ts

import QrCode from 'qrcode-generator';

export const handleStrToQRLink = (data: string) => {
  const qr = QrCode(0, 'M');
  qr.addData(data);
  qr.make();

  return qr.createDataURL(10);
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值