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

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

前言

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


image.png


原因

一开始不知道原因 后来在群友的帮助下 最后知道了原因 是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>
  );
}

image.png


项目给的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多选文件


image.png


return false控制只执行一次


image.png

customRequest


image.png


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;
        }
      };
    };
  })();



相关文章
|
前端开发
antd中table组件中如何进行换行操作(react中)
antd中table组件中如何进行换行操作(react中)
antd中table组件中如何进行换行操作(react中)
|
4月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与安全性。分块策略是其核心,直接影响检索效果与答案质量。本文系统解析五种主流分块方法——固定大小、语义、递归、基于结构及LLM分块,对比优缺点与适用场景,助力构建高效、可靠的RAG系统。
|
API 开发者
WebSocket API 中的 onerror 事件和 close 事件有什么不同?
【10月更文挑战第26天】`onerror`事件侧重于通知开发者WebSocket连接过程中出现的错误,以便进行相应的错误处理和恢复;而`close`事件则主要用于在连接关闭时进行资源清理和根据关闭情况采取适当的后续操作。两者在WebSocket应用的开发中都起着重要的作用,帮助开发者更好地管理和处理WebSocket连接的各种情况。
|
11月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
2825 1
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
1156 13
|
缓存 负载均衡 安全
什么是CDN服务
CDN(内容分发网络)是全球分布的服务器网络,旨在加速互联网内容的传输。它通过将内容缓存至靠近用户的服务器,减少延迟,提升访问速度与性能,同时实现负载均衡、减轻源服务器压力并提供安全防护。广泛应用于网站加速、视频直播等领域,优化用户体验。
12153 5
|
搜索推荐 JavaScript 数据可视化
uniapp/vue个性化单选、复选组件
uniapp/vue个性化单选、复选组件
575 5
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must b
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must b
2023 0
|
人工智能 前端开发 JavaScript
AI+脚本让我的效率翻倍,你也可以试试
本文分享了一名高级软件工程师如何利用 AI 工具(如 VSCode 插件 Codeium、通义灵码,及网页端的通义千问和 GPT-4)提升工作效率的经验。从代码生成、单元测试、脚本生成到文本润色,再到新框架学习,AI 工具在多个方面显著提高了开发效率和代码质量。文章还提供了具体示例和注意事项,帮助读者更好地应用这些工具。
813 1
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
916 1

热门文章

最新文章

下一篇
开通oss服务