ant design upload实现多个文件一次上传(全网首发)

前言

大家好 我是歌谣 在日常的学习生活中 我们会遇到各种各样的问题 今天在工作中就遇到了多个文件上传的时候会调用多次接口 感谢群友的帮助 想加入前端巅峰交流群可以私信我

在这里插入图片描述

原因

一开始不知道原因 后来在群友的帮助下 最后知道了原因 是onChange的原因

上传中、完成、失败都会调用这个函数

思路解答

群友给的demo
import "./styles.css";
import React, { useState, useEffect, useRef } from "react";
import { Button, Upload } from "antd";
import { UploadOutlined } from "@ant-design/icons";
export default function App() {
  const fileState = useRef();
  const [uploadFiles, setUploadFiles] = useState([]);
  const updateFiles = (function () {
    let fileList;
    return function (list, setState) {
      if (!fileList) {
        fileList = list;
        setState && setState(list);
      }
      return {
        fileList,
        reset() {
          fileList = false;
        }
      };
    };
  })();

  function beforeUpload(_, fileList) {
    fileState.current = updateFiles(fileList, setUploadFiles);
    return false;
  }
  const customRequest = () => {
    console.log("自定义上传", uploadFiles);
  };

  useEffect(() => {
    if (uploadFiles.length > 0) {
      customRequest();
      fileState.current.reset();
    }
  }, [uploadFiles]);
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <Upload
        listType="picture"
        maxCount={3}
        multiple
        beforeUpload={beforeUpload}
      >
        <Button>Upload (Max: 3)</Button>
      </Upload>
    </div>
  );
}

在这里插入图片描述

项目给的demo

upload部分

<Upload
                  name="file"
                  customRequest={customRequest}
                  multiple={true}
                  beforeUpload={beforeUpload}
                  headers={{ Authorization: getToken() || "" }}
                >
                  <Button style={{ width: "100%" }} icon={<UploadOutlined />}>
                    上传
                  </Button>
                </Upload>

beforeUpload部分

const fileState: any = useRef();
  const [uploadFiles, setUploadFiles] = useState([]);
  const updateFiles = (function () {
    let fileList: any = null;
    return function (list: any, setState: any) {
      if (!fileList) {
        fileList = list;
        setState && setState(list);
      }
      return {
        fileList,
        reset() {
          fileList = false;
        }
      };
    };
  })();
  useEffect(() => {
    if (uploadFiles.length > 0) {
      customRequest();
       fileState.current.reset();
    }
  }, [uploadFiles]);
  function beforeUpload(_: any, fileList: any) {
    fileState.current = updateFiles(fileList, setUploadFiles);
    return false;
  }
  const [loadingButton,setLoadingButton]=useState<boolean>(false)
  const customRequest = () => {
    let formData = new FormData();
    uploadFiles.forEach((file: any, index: any) => {
      formData.append(`file`, file
      );
    });
    uploadFile("manufacture/cutScheme/batchUploadDrawing", formData).then((res) => {
      if (res.code == 200) {
        setFileId(res.data.fileIdList)
        message.success("文件上传成功")
        setLoadingButton(false)
      } else {
        message.error(res.msg)
      }

    })
  };

解析部分

multiple多选文件

在这里插入图片描述

return false控制只执行一次 在这里插入图片描述 customRequest

在这里插入图片描述

formdata转文件格式

let formData = new FormData();
    uploadFiles.forEach((file: any, index: any) => {
      formData.append(`file`, file
      );

核心 hook写法

const updateFiles = (function () {
    let fileList: any = null;
    return function (list: any, setState: any) {
      if (!fileList) {
        fileList = list;
        setState && setState(list);
      }
      return {
        fileList,
        reset() {
          fileList = false;
        }
      };
    };
  })();

总结

我是歌谣 感谢生命中帮助你的每一个人 感谢山川\~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Ant Design Vue提供的Upload组件来实现文件上传。具体步骤如下: 1. 安装Ant Design Vue和Axios: ```bash npm install ant-design-vue axios --save ``` 2. 在main.js中引入Ant Design Vue和样式: ```javascript import Vue from 'vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; Vue.use(Antd); ``` 3. 在组件中使用Upload组件: ```vue <template> <a-upload :action="uploadUrl" :headers="headers" :before-upload="beforeUpload" :on-success="onSuccess" > <a-button icon="upload">上传文件</a-button> </a-upload> </template> <script> import axios from 'axios'; export default { data() { return { uploadUrl: 'http://localhost:3000/upload', // 上传接口 headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }, // 请求头部 }; }, methods: { beforeUpload(file) { // 限制上传文件的类型和大小 const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; if (!isJpgOrPng) { this.$message.error('只能上传 JPG/PNG 文件!'); return false; } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { this.$message.error('文件大小不能超过 2MB!'); return false; } return true; }, onSuccess(response) { this.$message.success('上传成功!'); }, }, }; </script> ``` 在上面的代码中,我们定义了一个Upload组件,设置了上传接口、请求头部、限制上传文件类型和大小的beforeUpload方法和上传成功的onSuccess方法。 需要注意的是,这里使用了Axios来发送请求,所以需要在组件中引入Axios。同时,需要在请求头部中带上Authorization字段,用于校验用户是否登录。你需要根据实际情况修改这些值。 另外,如果需要在上传成功后展示上传文件,可以在onSuccess方法中调用接口获取文件列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值