antd中Upload组件自定义上传文件

我的需求是,后端2个接口都需要这个文件的url,但是上传操作只能执行一次,那么如何做呢?

首先这个上传组件

  <Upload
    action={`${apiConfig?.prefix ?? '/'}${apiConfig.url}`}
    data={getDataFn}
    headers={{ Authorization: `Bearer ${getToken()}` }}
    onChange={handleUploadChange}
    fileList={fileLists}
    beforeUpload={file => checkFileType(file, mimeTypes)}
    showUploadList={loading}
    name="file"
  >

它有一个beforeUpload属性,上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传

上传时候,在beforeUpload方法里面,先把我们的文件给存起来

  /**
   * description 文件上传前判断文件类型
   */
  const checkFileType = (file, types = []) => {
    currentUpload.current = [file]; // 存到ref中
    if (types.length === 0) {
      return true;
    }
    /** 判断文件类型是否允许上传,比较类型不区分大小写 */
    const type = types.map(item => item.toLowerCase());
    const nameType = file.name
      .split('.')
      .pop()
      .toLowerCase();
    if (type.includes(nameType)) {
      setLoading(true);
      return true;
    }
    notification.error({
      message: `文件上传只支持${types.join(',')}类型`,
    });
    return false;
  };

当我们用第2个接口的时候

 const handleUpload = () => {
    const formData = new FormData();
    currentUpload.current.forEach(file => {
      //append主要是添加参数
      formData.append('file', file);
      formData.append('method', 'importPartyInfos');
      formData.append('params', '{}');
    });
    reqwest({
      url: '',
      method: 'post',
      processData: false,
      data: formData,
      headers: {
        Authorization: `Bearer ${getToken()}`,
      },
      success: res => {
      },
      error: () => {
        message.error('upload failed.');
      },
    });
  };

ok了,如果有不懂的可以私信我,我封装了一个专门自定义上传的组件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant DesignUpload组件可以通过设置`showUploadList`属性为`false`,然后使用自定义的进度条组件来实现上传进度的显示。 以下是一个上传大文件并显示进度条进度的示例代码: ```jsx import { Upload, Button } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; import React, { useState } from 'react'; const UploadProgress = ({ percent }) => ( <div style={{ margin: '10px 0' }}> <div style={{ width: `${percent}%`, height: '5px', backgroundColor: '#1890ff' }}></div> </div> ); const Demo = () => { const [uploading, setUploading] = useState(false); const [progress, setProgress] = useState(0); const handleUpload = ({ file }) => { const formData = new FormData(); formData.append('file', file); setUploading(true); // 模拟上传进度 const timer = setInterval(() => { setProgress((prevProgress) => { if (prevProgress >= 100) { clearInterval(timer); setUploading(false); return 100; } else { return prevProgress + 10; } }); }, 500); // 发送上传请求 // axios.post('/api/upload', formData) // .then(() => { // clearInterval(timer); // setUploading(false); // }) // .catch(() => { // clearInterval(timer); // setUploading(false); // }); }; return ( <Upload name="file" action="/api/upload" showUploadList={false} beforeUpload={() => false} onChange={() => {}} customRequest={handleUpload} > <Button icon={<UploadOutlined />} disabled={uploading}> {uploading ? '上传' : '点击上传'} </Button> {uploading && <UploadProgress percent={progress} />} </Upload> ); }; export default Demo; ``` 这段代码,我们定义了一个`UploadProgress`组件作为自定义的进度条组件,它接受一个`percent`属性用来表示上传进度的百分比。在`handleUpload`函数,我们使用`setInterval`模拟上传进度,并使用`setProgress`函数更新上传进度。当上传进度达到100时,我们清除定时器并将`uploading`状态设置为`false`,表示上传完成。在`Upload`组件,我们将`showUploadList`属性设置为`false`,禁用默认的上传列表,然后使用自定义的按钮和进度条组件来替代默认的上传按钮和上传进度条。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值