前端文件上传全过程

特别说明:ui框架使用的是蚂蚁的antd 这里主要是学习前端上传接口的传递参数包括前端上传之前对于代码的整理

一、第一步将前端页面画出来
在这里插入图片描述
源代码:

/** 费用管理 - IT费用管理 - 费用数据上传 */
import { useState } from "react";
import { WARNING_INFO } from "@/constants";
import { InboxOutlined } from "@ant-design/icons";
import { Button, Card, DatePicker, message, Spin, Upload, UploadProps } from "antd";
import dayjs from 'dayjs'
import './index.less'
import { ITDataUpload } from "@/services/costControl";

const DataUpload = () => {
    const [loading, setLoading] = useState<boolean>(false);
    const [fileList, setFileList] = useState<any>([]); //上传的文件列表
    const [dateString, setDateString] = useState<string>(''); // 数据日期

    // 文件组件属性
    const uploadProps: UploadProps = {
        multiple: false,
        maxCount: 1,
        onChange(info) {
        },
        beforeUpload: (file) => {
            console.log('上传文件', file);
            const regExp = /^.*\.(?:xls|xlsx)$/i
            const isExcel = regExp.test(file.name)
            if (!isExcel) {
                message.error(WARNING_INFO.EXCEL_INFO);
                return Upload.LIST_IGNORE
            }
            // if (file.size > 1024 * 1024 * 10) {
            //     message.error(`${file.name}大小不能超过10M`);
            //     return Upload.LIST_IGNORE;
            // }
            // 通过校验开始上传
            setFileList([file])
            // 阻止自动上传
            return false;
        },
        onRemove: () => {
            //console.log('删除');
            setFileList([])
        },
        onDrop(e) {
            //console.log('Dropped files', e.dataTransfer.files);
        },
    };

    const handleUpload = async (fileList: any) => {
        if (!dateString) {
            message.error('请选择数据日期')
        } else {
            //console.log('时间',dateString);
            //console.log('文件',fileList);
            try {
                setLoading(true);
                let res = await ITDataUpload({ date: dateString, file: fileList })
                //console.log('上传文件res', res);
                if (res?.code == 200) {
                    message.success('数据文件上传成功')
                    setLoading(false);
                    setFileList([])
                    setDateString('')
                } else {
                    message.error('数据文件上传失败')
                    setLoading(false);
                }
            } catch {
                setLoading(false);
            }
        }
    }

    const onChange = (date: any, dateString: any) => {
        setDateString(dayjs(dateString, 'YYYY-MM').format("YYYY-MM-01"))
    }

    return (
        <Spin tip="loading..." spinning={loading}>
            <Card bordered={false} style={{ width: '100%', minHeight: 'calc(100vh - 196px)', paddingTop: '60px', paddingLeft: '80px' }}>
                <div className="dateControl">
                    <span className="title">数据日期:</span>
                    <DatePicker
                        onChange={onChange}
                        style={{ width: 200 }}
                        picker="month"
                        value={dateString ? dayjs(dateString) : ''} />
                </div>
                <div className='uploadAndDownload'>
                    <span>上传文件:</span>
                    <Upload.Dragger {...uploadProps}
                        fileList={fileList}
                        className="draggerStyle">
                        <p className="ant-upload-drag-icon">
                            <InboxOutlined />
                        </p>
                        <p className="ant-upload-text">点击或者将文件拖拽到这里上传</p>
                        <p style={{ color: '#0000006e' }}>支持扩展名:xlsx,xls</p>
                    </Upload.Dragger>
                </div>
                <div className='buttonOption'>
                    <Button type="primary" onClick={() => {
                        //console.log('点击提交', fileList);
                        if (fileList.length > 0) {
                            handleUpload(fileList[0])
                        } else {
                            message.error('请上传文件!')
                        }
                    }}>提交</Button>
                    <Button onClick={() => {
                        //console.log('点击重置');
                        setFileList([])
                        setDateString('')
                    }}
                    >重置</Button>
                </div>
            </Card>
        </Spin>
    )
}

export default DataUpload

二、第二步将封装上传接口的函数整理出来(这个是核心)

在这里插入图片描述
源码:

 const handleUpload = async (fileList: any) => {
        if (!dateString) {
            message.error('请选择数据日期')
        } else {
            //console.log('时间',dateString);
            //console.log('文件',fileList);
            try {
                setLoading(true);
                let res = await ITDataUpload({ date: dateString, file: fileList })
                //console.log('上传文件res', res);
                if (res?.code == 200) {
                    message.success('数据文件上传成功')
                    setLoading(false);
                    setFileList([])
                    setDateString('')
                } else {
                    message.error('数据文件上传失败')
                    setLoading(false);
                }
            } catch {
                setLoading(false);
            }
        }
    }

三、第三步将封装的接口弄明白
在这里插入图片描述
源代码:

export const ITDataUpload = async (data: any) => {
    return request(costControlApi.ITDataUpload, {
        method: 'POST',
        data,
        headers: { 'Content-Type': 'multipart/form-data' },
        requestType: 'form',
    })
}

四、第四步将上传接口弄明白
在这里插入图片描述
五、第五步将上传结果演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🆗呀,这个就是整个的前端部分的文件上传,需要注意的是对上传接口的处理,其它的倒没有什么,相对于文件下载需要对接收到的数据流还要处理而言,整个文件上传还是异常简单的有没有感觉到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

【视频讲解】非参数重采样bootstrap逻辑回归Logistic应用及模型差异Python实现

全文链接&#xff1a;https://tecdat.cn/?p37759 分析师&#xff1a;Anting Li 本文将深入探讨逻辑回归在心脏病预测中的应用与优化。通过对加州大学欧文分校提供的心脏病数据集进行分析&#xff0c;我们将揭示逻辑回归模型的原理、实现过程以及其在实际应用中的优势和不足…

YOLOv7项目运行

YOLOv7项目运行 文章目录 YOLOv7项目运行推理训练1.数据集制作2.创建yaml文件3.运行脚本训练 遇到的问题 代码&#xff1a;WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors (githu…

机器学习——Bagging

Bagging&#xff1a; 方法&#xff1a;集成n个base learner模型&#xff0c;每个模型都对原始数据集进行有放回的随机采样获得随机数据集&#xff0c;然后并行训练。 回归问题&#xff1a;n个base模型进行预测&#xff0c;将得到的预测值取平均得到最终结果。 分类问题&#xf…

基于BiLSTM+Transformer混合模型实现交通流量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

stm32 外部中断

1.每个IO都可以配置外部中断&#xff0c;中断的出发方式有上升沿、下降沿、双边沿。这个是在EXTI里配置。 2.所有IO总共分成了16组&#xff0c;&#xff08;PA0,PB0…&#xff09;、&#xff08;PA1,PB1…&#xff09;、&#xff08;PA2,PB2…&#xff09;,…,&#xff08;PA15…

用Python提取PowerPoint演示文稿中的音频和视频

将多种格式的媒体内容进行重新利用&#xff08;如PowerPoint演示中的音频和视频&#xff09;是非常有价值的。无论是创建独立的音频文件、提取视频以便在线分发&#xff0c;还是为了未来的使用需求进行资料归档&#xff0c;从演示文稿中提取这些媒体文件可以为多媒体内容的多次…

Gnu Radio抓取WiFi信号,流程图中模块功能

模块流程如图所示&#xff1a; GNURadio中抓取WiFi信号的流程图中各个模块的功能&#xff1a; UHD: USRP Source&#xff1a; 使用此模块配置USRP硬件进行信号采集。设置频率、增益、采样率等参数。Complex to Mag^2&#xff1a; 将复数IQ数据转换为幅度的平方。Delay&#xf…

神经网络(五):U2Net图像分割网络

文章目录 一、网络结构1.1第一种block结构1.2第二种block结构1.3特征图融合模块1.4损失函数1.5总体网络架构1.6代码汇总1.7普通残差块与RSU对比 二、代码复现 参考论文&#xff1a;U2-Net: Going deeper with nested U-structure for salient object detection   这篇文章基于…

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习&#xff08;二&#xff09;异常检测&#xff08;基于高斯概率密度&#xff09; 0. 文章传送1.案例引入2.高斯正态分布3.异常检测算法4.异常检测 vs 监督学习5.算法优化6.代码实现 0. 文章传送 机器学习之监督学习&#xff08;一&#xff09;线性回归、多…

【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh

介绍 iTerm2 iTerm2是默认终端的替代品&#xff0c;也是目前Mac系统下最好用的终端工具&#xff0c;集颜值和效率于一身。 Oh-My-Zsh Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。 它基于Zsh 命令行&#xff0c…

N诺计算机考研-错题

D 我们熟知的Windows XP、Linux、Mac OS X等都是多用户多任务分时操作系统。 C 分布式系统:由一组独立的计算机组成的系统,这些计算机通过网络相互连接,并且对外界用户来说,它们共同工作就像是一个单一的、统一的计算平台或服务。分布式系统的关键特征: 透明性:用户和应…

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本&#xff0c;今天给大家介绍一款FL Studio21Mac版本&#xff0c;如果是Mac电脑的朋友请千万不要错过&#xff0c;当然我也不会忽略掉Win系统的FL&#xff0c;链接我会放在文章&#xff0c;供大家下载与分享&#xff0c;如果有其他问题&#xff0c;欢迎…

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…

Python第一篇:Python解释器

一&#xff1a;python解释器 python解释器是一款程序&#xff0c;用于解释、执行Python源代码。 一般python解释器都是c python使用c编写的&#xff0c;还有j python用java编写的。 二&#xff1a;python下载 三&#xff1a;使用示例 python进入控制台&#xff0c;python。 三…

【2.使用VBA自动填充Excel工作表】

目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程&#xff08;功能&#xff09;定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码&#xff0c;对应A公司工作表Us…

2024年最新Redis内存数据库主从复制、哨兵模式、集群部署等详细教程(更新中)

Centos 安装 Redis 检查安装 GCC 环境 [rootVM-4-17-centos ~]# gcc --version gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; no…

Cisco Secure Firewall Threat Defense Virtual 7.6.0 发布下载,新增功能概览

Cisco Secure Firewall Threat Defense Virtual 7.6.0 - 思科下一代防火墙虚拟设备 (FTDv) Firepower Threat Defense (FTD) Software for ESXi & KVM 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-firepower-7/&#xff0c;查看最新版。原创作品&#xff0c…

信息安全管理工程师(工信部教育与考试中心)

在信息技术迅猛发展的时代&#xff0c;信息安全已经成为企业乃至国家安全不可或缺的一环。 工信部高级信息安全管理工程师认证&#xff0c;作为软考中的一项顶尖资格认证&#xff0c;对提升信息安全管理人员的专业能力、确保信息安全性具有至关重要的作用。 本文将深入探讨该…

神经网络(四):UNet图像分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…