当前位置:首页 > JavaScript > 正文内容

React中如何实现文件上传功能

flowstone5年前 (2021-01-04)JavaScript886

场景描述

在前端页面中,经常会使用到文件上传功能,我们如何实现上传功能呢?

开发环境

  • React ^16.12.0

  • Ant Design ^5.0.12

  • SpringBoot 2.3.0

页面实现文件上传

首先我们要用到Ant框架中自带的上传组件Upload,代码如下所示


//index.tsx
const props = {    //组件的名字,调用接口时传递的名称
    name: 'file',    //上传前的操作
    beforeUpload: (file: any, fileList: any) => {      console.log('file, fileList', file, fileList);      //上传的文件列表  
      setFileList(fileList);      //返回false 代表暂停上传 需要我们自己实现
      return false;
    },
};
//下面代码是上传按钮
<Upload {...props}>
    <Button icon={<UploadOutlined />}>选择</Button>
</Upload>


上述代码,可以实现一个上传功能,但是还没有和后端有交互,效果图如下 

我们再添加一个上传按钮,来和后端交互,代码如下所示

//index.tsx
<Col style={{ margin: '10px 20px' }}>
    <Upload {...props}>
        <Button icon={<UploadOutlined />}>选择</Button>
    </Upload>
</Col>
<Col style={{ margin: '10px 20px' }}>
    <Button type="primary" onClick={uploadOnClick}>
    上传
    </Button>
</Col>


上传按钮绑定了一个事件uploadOnClick,如下所示

//index.tsx
//文件列表
const [fileList, setFileList] = useState([]);

const uploadOnClick = async () => {
    //表单上传需要创建一个FormData对象
    const formData = new FormData();
    fileList.forEach(file => {
        formData.append('file', file);
    });
    console.log('formData:', formData.get('file'));
    //调用上传接口
    const result = await upload(formData);
    console.log('data:', result);
};


前端调用的上传接口,如下所示

//service.ts
export const upload = (data: any) => {
    //此处对axios做了一层封装
    return post('/smsTemp/upload', data);
};
//----------- 上面代码也可以这样写 ------
export const upload = (data: any) =>
    new Promise(resolve => {
        axios('/smsTemp/upload', {
            method: 'POST',
            data,
        })
        .then((r: any) => resolve(r))
        .catch((e: any) => console.error(e));
});


前端代码,写得差不多了,可以写后端接口了

后端实现文件上传

控制器Controller的编写,代码如下所示

//SmsTemplateController.java
@PostMapping("/upload")
public R upload(MultipartFile file) {
    return smsTemplateService.upload(file);
}


具体实现,代码如下所示

//SmsTemplateServiceImpl.java
@Override
public R upload(MultipartFile uploadFile) {
    //获得文件名        
    String name = uploadFile.getName();
    //获得文件全名,带后缀
    String fullName = uploadFile.getOriginalFilename();
    //获得文件后缀名
    String suffix = fullName.substring(fullName.lastIndexOf("."));
    //此处写死上传路径,可以根据要求自定义
    String pathFile = "/Users/simonxue/Developer/Temp/"+name + suffix;
    File file = new File(pathFile);
    try {
        //上传文件
        uploadFile.transferTo(file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return R.ofSuccess("上传文件成功", pathFile);
}

扫描二维码推送至手机访问。

版权声明:本文由薛尧的博客发布,如需转载请注明出处。

本文链接:https://flowstone.sourceforge.io/?id=61

分享给朋友:

相关文章

AJAX省市县三级联动的实现

省市县数据本例子中省市县数据保存在MySQL数据库中,部分数据截图如下:从数据库中读取数据1、导入需要的jar包2、连接池配置文件<c3p0-config>     <!--&nb...

React Ant框架中分页的快速使用

使用环境ReactAnt DesignSpringBootSpring Data JPA前端页面首先,我们要查看Ant官方文档,一般涉及到分页的页面都是列表查询,在表格组件中找到API,可以从API中看到使用方法,查看文档后,编写代码如下&...

React中useState如何给对象中的某一个属性赋值

问题描述在React文件中使用了useState,定义了查询条件,这个查询条件实际上是一个对象,如下所示const [requestParam, setRequestParam] = useState...

JS中绑定方法加括号和不加括号的区别

问题描述在React开发中,遇到一个页面不停调用接口问题,如下图所示 问题解决查找哪里调用了接口,最后在刷新按钮上找到了问题所在,如下所示<Button     type="...

React中如何实现文件下载功能

场景描述在前端页面中,经常会使用到文件下载功能,我们如何实现下载功能呢?开发环境React ^16.12.0Ant Design ^5.0.12SpringBoot 2.3.0问题分析首先,想到下载,肯定要涉及文件流(字节流),后端接口返回...

Ant Design中使用Upload上传组件如何自定义文件列表展示位置

软件环境macOS Big Sur 11.1React 16.12.0Ant Design 4.10.0实际效果现有一个需求,是上传文件,点击浏览文件按钮,选中文件后,在按钮的上方显示,上传的文件列表,如下图所示 当前效果目前使用...