springboot如何快速实现多文件上传?

一、环境准备

jdk1.8 + springboot 2.3.1RELEASE

二、需求分析

产品突然加了这么个需求,要求对数据需求中的附件实现批量上传附件的功能。好家伙,一听,觉得没啥问题,又觉得有点欠妥,于是我便问了这么一句,需要支持文件批量嘛?你不问我还没觉得,那就加上吧!可支持用户批量上传。

三、实现过程

其实对于文件上传,还是老样子,通过formData表单提交的方式进行文件附件上传,而不是现在所谓的json接收格式数据,比如@RequestBody注解;那为什么不能用它来接收?因为@RequestBody默认接收的enctype(MIME编码)是application/json,因此发送POST请求时需要设置请求报文头信息,否则SpringMVC在解析集合请求参数时是不会自动转换成JSON数据再解析成相应的集合。

那对于multipart/form-data 提交方式,那我们就可以通过使用@RequestParam(springmvc中接收普通参数的注解),将请求参数绑定到控制器的方法参数上,或者你也省略映射不需要绑定(这就要求命名必须一致),那就靠spring对于formdata带文件和数据字段一起上传的情况做自动映射。如果需要对参数进行重命名, 那么你就可以使用@RequestParam 映射前端传过来的字段名,而接收的时候自己自定义就行,比如如下这种方式,前端传给你的参数字段叫id,而你接收则是用dfId。

@RequestParam("id") String dfId

而对于多文件的话,我们就可以定义一个 MultipartFile 数组接收即可。比如如下演示: 

@RequestParam("files") MultipartFile[] files

 这样的话,结合一下不就支持多文件上传协同其他字段一并提交处理了。

四、实现方案

通过上方我们对此的分析可得,我们可以有两种方式可以进行实现,虽然大同小异,但是论标准,我就给大家讲一种最合理的实现方式,接下来我以实际例子作为演示。

        比如,批量文件+数据字段的情况,论这种需求接口应该怎么定义呢?很好办呀?看我给大家露一手。仅供参考:

具体实现代码如下:


    @PostMapping(value = "/upload-files")
   //@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 推荐 
   //这种
    @ApiOperation(value = "文件上传(支持批量)", notes = "文件上传(支持批量)")
    public Result<Object> uploadFiles(@RequestParam("files") MultipartFile[] files) throws IOException {
        List<String> newFileNames = new ArrayList<>();
        for (MultipartFile multipartFile : files) {
            String fileName = multipartFile.getOriginalFilename();
            //KB单位
            long fileSize = multipartFile.getSize();
            if (fileSize >= fileSizeLimit) {
                long sizeOfMb = fileSizeLimit / (1024 * 1024);
                return Result.failure(CodeEnum.FAILURE.getCode(), "上传的文件为【" + fileName + "】,大小为【" + fileSize + "】KB,不能超过【" + sizeOfMb + "】MB,请重新上传!");
            }
            //文件名称加随机数处理,避免重名
            String newFileName = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + System.currentTimeMillis() % 10000 + fileName.substring(fileName.lastIndexOf("."));

            //获取Excel表单
            AmazonS3Utils.upload(s3Client, bucketName, newFileName, multipartFile);

            newFileNames.add(newFileName);
        }
        return Result.success(true);
    }
}

然后我们来通过postman来测试下该接口,看看是否能拿到该参数信息,包括文件。

可能会出现该异常情况

org.springframework.web.multipart.MultipartException: Current request is not a multipart request

调整接口请求方式为

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莱恩大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值