react + pro-components + ts完成单文件上传和批量上传

上传部分使用的是antd中的Upload组件,具体如下:

GradingFilingReportUpload方法是后端已经做好文件流,前端只需要调用接口即可

单文件上传

<Upload
    key={`upload_${record.id}`}
    showUploadList={false}
    accept=".xlsx"
    maxCount={1}
    customRequest={({ file }) => {
        const formData = new FormData();
        formData.append('id', record.id);
        formData.append('ins', file);
        GradingFilingReportUpload(formData).then(res => {
            if (res.state === 200) {
                message.success(res.message);
            } else {
                message.error('上传失败');
            }
        })
    }}
><a >上传</a></Upload>

多文件上传

页面组件

<Upload
    showUploadList={false}
    multiple
    customRequest={({ file, onSuccess, onError }) => {
        handleRequestAllFile([file]).then(() => onSuccess && onSuccess('上传成功')).catch(() => onError)
    }}
>
    <a >批量上传</a>
</Upload>

js逻辑

    const handleRequestAllFile = async (fileList: any[]) => {
        try {
            const formData = new FormData();
            fileList.forEach((file) => {
                formData.append('ins', file);
            })
            const res = await GradingFilingReportUpload(formData);
            if (res.state === 200) {
                message.success('文件上传成功');
            } else {
                message.error('文件上传失败');
            }
        } catch (e) {
            message.error('文件上传过程出错')
        }
    }

完整页面代码 

import { downLoad, downLoadStream } from '@/util/request';
import { ProTable } from '@ant-design/pro-components';
import { getTableColumns } from './colums'
import { useEffect, useRef, useState } from 'react';
import DeleteBtn from './components/DeleteBtn';
import { Button, Table, Upload, message } from 'antd';
import { DeleteOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import type { GradingFilingReportData, GradingFilingReportSelect } from '@/types/GradingFilingReport';
import { GradingFilingReportDataList, deleteDataById, GradingFilingReportUpload } from '@/service/GradingFilingReport'
import AddEditModal, { MODAL_TYPE } from './components/AddEditModal';
const GradingFilingReport = () => {
    const [columns, setColumns] = useState<ProColumns<GradingFilingReportData>[]>([]);
    const actionRef = useRef<ActionType>();
    const [SortOrderTest, setSortOrderTest] = useState<string>('');
    const [valueEnums, setValueEnums] = useState<GradingFilingReportSelect>({});
    // 获取表格数据
    const getData = async (filter: any) => {
        const params = { ...filter, offSet: filter.current, orderType: SortOrderTest };
        delete params.current;
        const { state, total, data } = (await GradingFilingReportDataList(params)) || {};
        if (state === 200) {
            return { data, success: true, total: total };
        } else {
            return { data: [] };
        }
    };
    // 下载文件
    const downLoadFileThis = async (item: any) => {
        let fileName = item.systemName + '.xlsx'
        let id = item.id
        let downloadParams = { id }
        let url = '/projectAcceptance/service/ratingFilingReportService/downloadReport/0'
        downLoad(url, downloadParams).then(res => {
            downLoadStream(res, fileName);
        }).catch((e) => {
            message.error('导出失败');
        }).finally(() => {
            console.log('完成');
        })
    }
    // 获取表格的表头数据
    const getTableConfig = async () => {
        const { columns, valueEnums } = await getTableColumns();
        setValueEnums(valueEnums);
        setColumns([
            ...columns,
            {
                title: '操作',
                valueType: 'option',
                key: 'option',
                fixed: 'right',
                width: 160,
                align: 'center',
                render: (text, record: any, index, action) => [
                    <AddEditModal
                        key={`edit_${record.id}`}
                        type={MODAL_TYPE.EDIT}
                        record={record}
                        valueEnums={valueEnums}
                        callback={() => {
                            action && action.reload();
                        }}
                    />,
                    <DeleteBtn<Array<any>>
                        key={`delete_${record.id}`}
                        params={record.id || ''}
                        method={deleteDataById}
                        callback={() => {
                            action && action.reload();
                        }}
                    />,
                    <Upload
                        key={`upload_${record.id}`}
                        showUploadList={false}
                        accept=".xlsx"
                        maxCount={1}
                        customRequest={({ file }) => {
                            const formData = new FormData();
                            formData.append('id', record.id);
                            formData.append('ins', file);
                            GradingFilingReportUpload(formData).then(res => {
                                if (res.state === 200) {
                                    message.success(res.message);
                                } else {
                                    message.error('上传失败');
                                }
                            })
                        }}
                    ><a >上传</a></Upload>
                    ,
                    <a key={`download_${record.id}`} onClick={() => downLoadFileThis(record)}>下载</a>
                ],
            },
        ]);
    }
    // 批量上传的方法
    const handleRequestAllFile = async (fileList: any[]) => {
        try {
            const formData = new FormData();
            fileList.forEach((file) => {
                formData.append('ins', file);
            })
            const res = await GradingFilingReportUpload(formData);
            if (res.state === 200) {
                message.success('文件上传成功');
            } else {
                message.error('文件上传失败');
            }
        } catch (e) {
            message.error('文件上传过程出错')
        }
    }
    // 批量上传的按钮
    const toolBarRender = (action: ActionType | undefined) => {
        return [
            <Upload
                showUploadList={false}
                multiple
                customRequest={({ file, onSuccess, onError }) => {
                    handleRequestAllFile([file]).then(() => onSuccess && onSuccess('上传成功')).catch(() => onError)
                }}
            >
                <a >批量上传</a>
            </Upload>
        ];
    };
    // 完成排序功能
    const handleChange = (pagination: any, filters: any, sorter: any) => {
        console.log(sorter, 'sorter');
        if (sorter.order !== undefined) {
            setSortOrderTest(sorter.order === 'descend' ? 'DESC' : 'ASC');
        }
    };
    // 初始化调用
    useEffect(() => {
        getTableConfig()
    }, [])
    return (
        <ProTable<GradingFilingReportData>
            rowKey="id"
            cardBordered
            actionRef={actionRef}
            request={getData}
            columns={columns}
            search={{
                labelWidth: 100,
            }}
            onChange={handleChange}
            toolBarRender={toolBarRender}
            scroll={{ x: 'max-content' }}
            rowSelection={{
                selections: [Table.SELECTION_ALL],
            }}
            tableAlertOptionRender={({ selectedRowKeys }) => {
                return (
                    <DeleteBtn<Array<any>>
                        content={
                            <Button type="link" icon={<DeleteOutlined />}>
                                {'批量删除'}
                            </Button>
                        }
                        method={deleteDataById}
                        params={selectedRowKeys}
                        callback={() => actionRef.current && actionRef.current.reload()}
                    />
                );
            }}
        />
    )
}
export default GradingFilingReport

相关推荐

  1. react + pro-components + ts完成文件批量

    2024-07-18 11:22:01       26 阅读
  2. 文件

    2024-07-18 11:22:01       53 阅读
  3. asp.net表文件

    2024-07-18 11:22:01       34 阅读
  4. 文件的分片断点

    2024-07-18 11:22:01       36 阅读
  5. nestjs文件

    2024-07-18 11:22:01       63 阅读
  6. springMVC-文件

    2024-07-18 11:22:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 11:22:01       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 11:22:01       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 11:22:01       62 阅读
  4. Python语言-面向对象

    2024-07-18 11:22:01       72 阅读

热门阅读

  1. MongoDB 基本查询语句

    2024-07-18 11:22:01       22 阅读
  2. ubuntu 源码安装postgresql16.0

    2024-07-18 11:22:01       24 阅读
  3. 【Tomcat9正确配置server.xml请求头信息】

    2024-07-18 11:22:01       21 阅读
  4. MYSQL设计索引一般需要考虑哪些因素?

    2024-07-18 11:22:01       25 阅读
  5. 华为OD机考题(典型题回顾)

    2024-07-18 11:22:01       21 阅读
  6. 手写实现简单Redis命令客户端功能

    2024-07-18 11:22:01       18 阅读
  7. Leetcode 238. 除自身以外数组的乘积

    2024-07-18 11:22:01       23 阅读
  8. qt listview 列表文字显示不全,如何用悬浮显示?

    2024-07-18 11:22:01       18 阅读
  9. PF4J+SpringBoot

    2024-07-18 11:22:01       20 阅读