React Antd Upload自定义上传customRequest

本文介绍如何在React应用中使用Ant Design Upload组件实现定制上传图片功能,并通过axios处理上传请求,展示如何解析服务器返回的文件信息。关键在于理解自定义请求配置及状态管理。

  单独的上传图片接口要传参,action方式不太适合,需要使用自定义上传customRequest覆盖

 

 

 公司代码不可弄,就发一个可用的demo例子

import React, { useState } from "react";
import { render } from "react-dom";
import "antd/dist/antd.css";
import axios from "axios";
import "./style.css";

import { Upload, Progress } from "antd";

const App = () => {
  const [defaultFileList, setDefaultFileList] = useState([]);
  const [progress, setProgress] = useState(0);

  const uploadImage = async options => {
    const { onSuccess, onError, file, onProgress } = options;

    const fmData = new FormData();
    const config = {
      headers: { "content-type": "multipart/form-data" },
      onUploadProgress: event => {
        const percent = Math.floor((event.loaded / event.total) * 100);
        setProgress(percent);
        if (percent === 100) {
          setTimeout(() => setProgress(0), 1000);
        }
        onProgress({ percent: (event.loaded / event.total) * 100 });
      }
    };
    fmData.append("image", file);
    try {
      const res = await axios.post(
        "https://jsonplaceholder.typicode.com/posts",
        fmData,
        config
      );

      onSuccess(res);
      console.log("server res: ", res);
    } catch (err) {
      console.log("Eroor: ", err);
      const error = new Error("Some error");
      onError({ err });
    }
  };

  const handleOnChange = ({ file, fileList, event }) => {
    // console.log(file, fileList, event);
    //Using Hooks to update the state to the current filelist
    setDefaultFileList(fileList);
    //filelist - [{uid: "-1",url:'Some url to image'}]
  };

  return (
    <div class="container">
      <Upload
        accept="image/*"
        customRequest={uploadImage}
        onChange={handleOnChange}
        listType="picture-card"
        defaultFileList={defaultFileList}
        className="image-upload-grid"
        onProgress={({ percent }) => {
          console.log("progre...", percent);
          if (percent === 100) {
            setTimeout(() => setProgress(0), 1000);
          }
          return setProgress(Math.floor(percent));
        }}
      >
        {defaultFileList.length >= 1 ? null : <div>Upload Button</div>}
      </Upload>
      {progress > 0 ? <Progress percent={progress} /> : null}
    </div>
  );
};

render(<App />, document.getElementById("root"));

onSuccess(res);

接口返回的数据都存到fileList里每个file的responese属性,还有state,可以在onChange里进行逻辑处理!!!

在 Ant Design (antd) 的 Upload 组件中,`customRequest` 是一个用于自定义上传行为的属性。它允许你覆盖默认的上传逻辑,通常用于与自定义的后端 API 集成或实现特殊的上传需求。 以下是一个使用 `customRequest` 的示例代码: ```jsx import React from 'react'; import { Upload, Button } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; const CustomUpload = () => { const customRequest = async (options) => { const { file, onSuccess, onError, onProgress } = options; try { // 模拟上传进度 const updateProgress = (percent) => { onProgress({ percent }, file); }; // 模拟上传过程 for (let i = 0; i <= 100; i += 10) { await new Promise(resolve => setTimeout(resolve, 100)); updateProgress(i); } // 模拟上传成功 onSuccess('上传成功', file); console.log('上传成功', file); } catch (error) { onError(error); console.error('上传失败', error); } }; return ( <Upload customRequest={customRequest} showUploadList={true} > <Button icon={<UploadOutlined />}>点击上传</Button> </Upload> ); }; export default CustomUpload; ``` 在这个示例中,我们定义了一个 `customRequest` 函数,它模拟了文件上传的过程。`options` 参数包含了上传相关的信息和方法,例如: - `file`: 要上传的文件对象。 - `onSuccess`: 上传成功时的回调函数。 - `onError`: 上传失败时的回调函数。 - `onProgress`: 上传进度更新的回调函数。 在 `customRequest` 函数中,我们模拟了上传进度,并在上传完成后调用 `onSuccess`。如果上传过程中发生错误,则调用 `onError`。 你可以根据实际需求修改 `customRequest` 函数,例如使用 `fetch` 或 `axios` 来实现真实的文件上传。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yusirxiaer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值