Blame view

src/components/FeeweeUpload/index.tsx 3.56 KB
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
1
2
3
4
5
  /*
   * @Date: 2021-01-05 14:24:23
   * @LastEditors: wangqiang@feewee.cn
   * @LastEditTime: 2021-03-11 12:55:38
   */
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
6
7
8
9
10
  import React from "react";
  import { message, Upload } from "antd";
  import { UploadProps } from "antd/lib/upload";
  import { RcFile, UploadFile } from "antd/lib/upload/interface";
  import getFidFile from "@/utils/getFidFile";
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
11
12
  
  interface Props extends UploadProps {
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
13
14
15
16
    isFid?: boolean; // 预览文件 路径是否为 fid 形式
    limitSize?: number; // 限制文件大小,单位MB
    limitUnit?: "kb" | "mb" | "KB" | "MB"; // 限制大小单位, 默认MB
    children?: React.ReactNode;
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  }
  
  /**
   * @description: 自定义封装的Upload上传组件
   * @description: 目前主要有2个功能:
   * 1. 预览文件,通过isFid属性判断是否是fid链接,然后通过新生成的a标签,跳转新页面打开文件。
   * 2. 限制上传文件大小,通过传入limitSize和limitUnit属性,判断传入文件的大小是否符合条件。
   * 2.1. 这里有一点需要这里,
   * 为了解决在表单中使用,当超过限制后,原有filelist中的文件都被清空,
   * 需要在Form.Item 传入的getValueFromEvent回调函数中多添加2行判断函数:
   *if (e.file.status === 'size_limit') {
      return e.fileList.filter((file: any) => file.uid !== e.file.uid);
    }
   * @param {Props} props
   */
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
32
33
34
35
36
37
38
  export default function FeeweeUpload({
    isFid = false,
    limitSize = undefined,
    limitUnit = "MB",
    children,
    ...props
  }: Props) {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
39
40
41
42
43
44
    const onPreview = (file: UploadFile) => {
      if (props.onPreview) {
        props.onPreview(file);
        return;
      }
      getFidFile(file.response.data, isFid);
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
45
    };
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
46
47
  
    const beforeUpload = (file: RcFile, filelist: RcFile[]) => {
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
48
      if (limitSize !== undefined && typeof limitSize === "number") {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
49
50
51
52
53
54
55
56
57
58
        const limit = isExceededSize(file, limitSize, limitUnit);
        if (limit.success) {
          return true;
        } else {
          message.error(limit.msg);
          /**
           * 将文件状态status设置为 size_limit,
           * 当表单中使用时,可以在getValueFromEvent回调函数中多添加2行判断函数:
           * if (e.file.status === 'size_limit') {
           *    return e.fileList.filter((file: any) => file.uid !== e.file.uid);
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
59
60
61
62
           * }
           */
          // @ts-ignore
          file.status = "size_limit";
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
63
64
65
66
          return false;
        }
      }
      return props.beforeUpload ? props.beforeUpload(file, filelist) : true;
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
67
    };
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
68
69
70
  
    return (
      <>
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
71
        <Upload {...props} beforeUpload={beforeUpload} onPreview={onPreview}>
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
72
73
74
          {children}
        </Upload>
      </>
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
75
    );
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
76
77
78
79
80
81
82
83
  }
  
  /**
   * @description: 计算限制大小,统一返回限制大小转换为KB
   * @param {number} limitSize
   * @param {'kb' | 'mb' | 'KB' | 'MB'} limitUnit
   * @return {number}
   */
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
84
85
86
87
88
  function getLimitSize(
    limitSize: number,
    limitUnit: "kb" | "mb" | "KB" | "MB"
  ): number {
    if (limitUnit === "kb" || limitUnit === "KB") {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
89
90
      return limitSize;
    }
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
91
    if (limitUnit === "mb" || limitUnit === "MB") {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
92
93
94
95
96
97
98
99
100
101
102
103
      return limitSize * 1024;
    }
    return 0;
  }
  
  /**
   * @description: 判断是否没超过限制大小
   * @param {RcFile} file
   * @param {number} limitSize
   * @param {*} limitUnit
   * @return {{ success: boolean, msg?: string }}
   */
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
104
105
106
107
108
  function isExceededSize(
    file: RcFile,
    limitSize: number,
    limitUnit: "kb" | "mb" | "KB" | "MB"
  ): { success: boolean; msg?: string } {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
109
110
111
112
    const _limitSize = getLimitSize(limitSize, limitUnit);
  
    const fileSizeToKB = file.size / 1024;
    if (fileSizeToKB <= _limitSize) {
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
113
114
      return { success: true };
    } else {
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
115
116
117
118
      return {
        success: false,
        msg: `文件【${file.name}】大小不能超过${limitSize}${limitUnit}`,
      };
cc26d1fc   张志伟   🎉 重新构建项目,解决项目过大的问题
119
    }
b8c12fea   王强   修改 周期性工作设置,添加验收类型...
120
  }