SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

在实际项目中,会有通过前端上传单个文件,甚至多个文件的请求.
本篇博客就会介绍后端如何实现这种类型的接口,以及如何使用postman去调用

文章目录

一. SpringBoot项目中使用MultipartFile上传单文件

1.1 场景一: 上传单个文件,不包含其它参数

1.1.1 后端实现, 在Controller层添加如下代码

 @RestController
@RequestMapping("/test")
public class MultipartFileController {
    @PostMapping
    public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile) throws Exception{
        File file = new File("E:\data\test\testFile");
        multipartFile.transferTo(file);
        return file.getAbsolutePath();
    }
}

上述代码实现的主要功能是,接受接口调用传入的文件,转换为本地文件,并返回本地文件的绝对路径

1.1.2 postman接口调用

首先接口类型是Post, Headers里需要添加
key: Content-Type , value:multipart/form-data;
在这里插入图片描述

请求体里, 首先:
要选择from-data这种方式,key的格式设置为File,key的值为multipartFile(这里不唯一,实际情况根据后端定义的参数值名称来确定), 然后随便选择一个文件上传
在这里插入图片描述
调用接口,返回了生成文件的路径
在这里插入图片描述
在资源管理器查看这个文件内容和上传的文件一致
在这里插入图片描述

1.2 场景二: 上传单个文件,包含其它参数

1.2.1 java后台代码

后台代码,只需要通过@RequestParam指定接口调用的参数即可,没有特殊的地方

    @PostMapping
    public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile,
                                    @ApiParam(value = "用户名") @RequestParam  String username,
                                    @ApiParam(value = "邮箱") @RequestParam String email) throws Exception{
        File file = new File("E:\data\test\testFile");
        multipartFile.transferTo(file);
        return "path: " + file.getAbsolutePath() + " username: " + username + " email: " + email;
    }

1.2.2 postman接口调用

在form-data里添加对应的参数即可,注意key的格式是默认的Text类型,
调用也是正常的
在这里插入图片描述

1.3 场景三: 上传单个文件,包含其它请求实体

1.3.1 后端实现

首先创建一个最简单的实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author xmr
 * @date 2022/4/17 10:51
 * @description
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDO {
    private String username;
    private String email;
    private int age;
    private String address; 
}

crontroller代码,注意: 这里不要用常规的@RequestBody,访问接口的时候会报错Unsupported Media Type,而是应该使用@Valid注解,
javax.validation包下,后台代码如下:

    @PostMapping
    public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile,
                                    @ApiParam(value = "用户名") @Valid UserDO userDO
                                 ) throws Exception{
        File file = new File("E:\data\test\testFile");
        multipartFile.transferTo(file);
        return  userDO.toString();
    }

1.3.2 postman接口调用

这里和常规的RequestBody也是有区别的,就是将实体类的每个属性值当做单独的key上传上来
在这里插入图片描述

二. SpringBoot项目中使用MultipartFile上传多文件

2.1 上传多个文件,不包含其它参数

2.1.1后端实现

为了更直观的展示,这里返回一个JSONObject对象, 输出每个文件的大小

    @PostMapping
    public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles
                                 ) throws Exception{
        JSONObject jsonObject = new JSONObject();
        for(int i = 0; i < multipartFiles.length; i++) {
            jsonObject.put("file" + i, multipartFiles[i].getSize());
        }

       return jsonObject;
    }

2.1.2 postman接口调用

这里有个特殊的地方,就是不管传多少文件,key首先是file类型,其次命名均为multipartFiles(同样,这里由后台接口命名时确定)
我这里上传了4个正常文件和一个一个空的


最终接口返回结果:
在这里插入图片描述

2.2 上传多个文件,包含其它参数

2.2.1 后端接口代码

    @PostMapping
    public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles, 
                                        @RequestParam String username,
                                        @RequestParam int age
                                 ) throws Exception{
        JSONObject jsonObject = new JSONObject();
        for(int i = 0; i < multipartFiles.length; i++) {
            jsonObject.put("file" + i, multipartFiles[i].getSize());
        }
        jsonObject.put("username", username);
        jsonObject.put("age", age);
       return jsonObject;
    }

2.2.2 postman接口调用

没什么特殊的地方,key增加对应的属性即可
在这里插入图片描述

2.3 上传多个文件,包含其它请求体

2.3.1 后台代码

同1.3 请求体需要使用@Valid注解而不是@RequestBody

   @PostMapping
    public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles,
                                        @Valid UserDO userDO
                                 ) throws Exception{
        JSONObject jsonObject = new JSONObject();
        for(int i = 0; i < multipartFiles.length; i++) {
            jsonObject.put("file" + i, multipartFiles[i].getSize());
        }
        jsonObject.put("user", userDO.toString());
       return jsonObject;
    }

2.3.2 postman接口调用

multipartFiles参数后面依次添加实体类里面的每一个属性值即可
如下图:
在这里插入图片描述

2.4 复杂场景测试,既包含一个文件,也包含多个文件,同时包含参数和请求体

2.4.1后台代码

  @PostMapping
    public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles,
                                        @RequestParam MultipartFile multipartFile,
                                        @RequestParam String paramTest,
                                        @Valid UserDO userDO
                                 ) throws Exception{
        JSONObject jsonObject = new JSONObject();
        for(int i = 0; i < multipartFiles.length; i++) {
            jsonObject.put("file" + i, multipartFiles[i].getSize());
        }
        jsonObject.put("user", userDO.toString());
        jsonObject.put("paramTest", paramTest);
        jsonObject.put("multipartFile", multipartFile.getSize());
       return jsonObject;
    }

2.4.2 postman接口调用

注意事项: 文件的上传key需要选择File格式,同时参数名应该与后端代码约定的保持一致,
对象依旧是把对象的每个属性单独作为参数

在这里插入图片描述
相信有了2.4这个案例, 项目中上传文件需求的任何场景应该都能够满足了

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

猜你喜欢

转载自blog.csdn.net/m0_67391907/article/details/126115867
今日推荐