SpringBoot前后端分离项目上传文件功能

本文介绍SpringBoot项目中实现文件上传功能的方法,包括接口开发、配置文件大小限制及异常处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot前后端分离项目开发中,上传文件的功能还是比较常见的。SpringBoot是支持上传文件功能,默认的单个文件大小限制为spring.servlet.multipart.max-file-size=1MB,单个请求限制为spring.servlet.multipart.max-request-size=10MB。项目中可以设置单个文件上传大小限制以及单个请求大小限制,以及文件超过最大限制后返回自定义Restful风格的Json字符串。

功能开发

接口开发比较简单,直接在接口中处理MultipartFile文件参数即可,将接收到的文件存到服务器上,然后返回服务器上存储的上传文件的信息,示例代码如下:

    @PostMapping("upload")
    @ApiOperation("上传文件")
    public ApiResult<String> upload(MultipartFile file) {

        if (file != null) {
            String fileName = file.getOriginalFilename();


            String code = UUID.randomUUID().toString().replaceAll("-", "");
            String newFileName = code + fileName.substring(fileName.lastIndexOf('.'));
            String currentDateFolder = DateFormatUtils.format(new Date(), "yyyyMMdd");

            String destFilePath = "D:/uploads" + File.separator + currentDateFolder + File.separator + newFileName;
            try {

                File destFile = new File(destFilePath);
                if (!destFile.getParentFile().exists()) {
                    destFile.getParentFile().mkdirs();
                }

                file.transferTo(destFile);

                // 这里直接返回的服务器上的物理地址,项目中需要根据实际情况自行处理
                return ApiResult.success(destFilePath);

            } catch (IOException e) {
                // TODO 异常处理
            }

        }
        
        // ApiResult为封装的接口统一返回泛型类,项目中根据实际情况处理
        return ApiResult.failed();
    }

上传文件配置

SpringBoot默认的单个文件大小限制为spring.servlet.multipart.max-file-size=1MB,单个请求限制为spring.servlet.multipart.max-request-size=10MB。默认的文件限制可能不满足项目需求,我们可以设置自己项目的限制,application.yml示例配置如下:

server:
  tomcat:
    # 内嵌tomcat最大请求吞吐量限制,-1表示没有限制,如果不配置上传文件超过最大限制后tomcat会取消请求,前端的请求将会没有返回
    max-swallow-size: -1

spring:
  # springboot2.0以后文件大小限制配置
  servlet:
    # spring默认的上传文件大小限制是1MB,单次请求文件总数不能大于10MB,如果要移除限制设置为-1
    multipart:
      max-file-size: 20MB #单个文件大小
      max-request-size: 100MB #单次请求文件总大小

上面的application.yml配置中我们设置了server.tomcat.max-swallow-size=-1,此设置对于自定义返回非常重要。

文件超过限制异常自定义处理

当上传文件超过限制后,会抛出MaxUploadSizeExceededException异常,一般情况下我们只需要捕获该异常,并返回自定义对象就可以了。但是如果我们直接这样处理,会发现上传接口文件大小超限制后,前端请求无法获取结果,我们自定义的结果没有正常返回,导致前端无法友好的处理显示。这是因为如果我们未设置server.tomcat.max-swallow-size时,上传文件超过大小限制后会被tomcat取消请求,导致没有结果返回。此时我们需要在application.yml中增加server.tomcat.max-swallow-size=-1的设置,该设置的作用是当请求超过限制后,tomcat不要取消该次请求。参考:https://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ApiResult maxUploadSizeHandler(MaxUploadSizeExceededException exception) {
        ApiResult response = ApiResult.validateFailed("上传文件超过最大限制");

        return response;
    }
}

测试

在Swagger中我们上传一个超过限制大小的文件,文件限制异常会被正确的捕获并返回统一的Json格式错误信息,以便前端处理,测试截图如下:

总结 

SpringBoot前后端项目开发文件上传的功能不难,网上也有很多文章讲解,文件大小限制也比较容易通过网上获取。上传文件接口,当超过大小限制异常自定义处理返回Json格式的信息网上的相关内容比较少。这里做一个记录和总结,希望其它网友遇到该问题的时候,能够通过此文获得帮助。如果文中有描述不正确的地方,希望网友及时指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值