ant design 3.x中upload组件 上传图片压缩

这篇博客展示了如何在React应用中实现图片上传功能,包括自定义上传逻辑、图片压缩以及上传进度显示。通过`useState`管理状态,`fetch`进行API调用,以及`FileReader`和`canvas`进行图片压缩。此外,还涵盖了文件列表更新、移除文件以及`beforeUpload`预处理步骤的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不想描述多余的,直接看代码简单直接

const [defaultFileList, setDefaultFileList] = useState([]);

 <Upload
                accept="image/*"
                customRequest={uploadImage}
                onChange={handleOnChange}
                listType="picture-card"
                showUploadList={true}
                fileList={defaultFileList}
                onRemove={removeFileItem}
                beforeUpload={beforeUpload}
                className="image-upload-grid"
              >
                {defaultFileList.length >= 3 ? null : uploadButton}
              </Upload>
  • customRequest 自定义上传图片的
  const uploadImage = async options => {
    const { onSuccess, onError, file, onProgress, fileList } = options;
    const fmData = new FormData();
    fmData.append('file', file);
    try {
      fetch(`***/api/common/upload_file`, {
        method: 'POST',
        credentials: 'include',
        body: fmData
      })
        .then(response => response.json())
        .catch(error => {
          message.error('error');
        })
        .then(response => {
          onSuccess('Ok');
          if (response.code === 0) {
            let list = {
              uid: file.uid,
              data: response.data
            };
            //setDefaultFileList 这个这个一定需要
            setDefaultFileList([
              ...defaultFileList,
              { ...file, url: `https:www.***.com/api/file/download/${response.data}`, uid: response.data }
            ]);
            setState({
              imgList: [...imgList, list]
            });
            setState({
              imgfileId: [...imgfileId, response.data]
            });
          } else {
            message.error(response.msg);
          }

          console.log('Success:', response);
        });
    } catch (err) {
      console.log('Eroor: ', err);
      const error = new Error('Some error');
      onError({ err });
    }
  };
  • beforeUpload 压缩图片在这一步操作
const beforeUpload = (file, fileList) => {
    return new Promise(resolve => {
      // 图片压缩
      let reader = new FileReader(),
        img = new Image();
      reader.readAsDataURL(file);
      reader.onload = function(e) {
        img.src = e.target.result;
      };

      img.onload = function() {
        let canvas = document.createElement('canvas');
        let context = canvas.getContext('2d');

        let originWidth = this.width;
        let originHeight = this.height;

        canvas.width = originWidth;
        canvas.height = originHeight;

        context.clearRect(0, 0, originWidth, originHeight);
        context.drawImage(img, 0, 0, originWidth, originHeight);

        canvas.toBlob(
          blob => {
            let imgFile = new File([blob], file.name, { type: file.type }); // 将blob对象转化为图片文件
            resolve(imgFile);
          },
          file.type,
          0.2
        ); // file压缩的图片类型
      };
    });
  };
  • onChange 一定需要
  const handleOnChange = ({ file, fileList, event }) => {
    let a = {
      uid: '1',
      name: file.name,
      status: 'uploading',
      url: ''
    };
    setDefaultFileList([a]);
  };
  • onRemove 也需要
  const removeFileItem = (file, fileList) => {
    console.log('file', file, fileList);
    console.log(defaultFileList);

    const matchKey = file.uid !== undefined ? 'uid' : 'name';
    const removed = defaultFileList.filter(item => item.uid !== file[matchKey]);
    if (removed.length === defaultFileList.length) {
      return null;
    }
    setDefaultFileList(removed);
    return removed;
  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值