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

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
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
现有功能 + 资源管理(上传、下载、移动、修改、删除) + 资源分享 + 资源共享 + 资源转存 + 资源预览(pdf编辑、图片、视频)(office 三件套待支持) + 断点续传 + 敏感词过滤 + 流式视频播放 + 秒传支持 ## 部分界面展示 + 上传资源 ![1681026799763](https://user-images.githubusercontent.com/50403161/230761214-a032ac84-5a89-4b82-a958-2639dd365dae.jpg) + 分享资源 ![1679735946504](https://user-images.githubusercontent.com/50403161/227708656-6a4d8142-f6fc-40b0-884f-f9e36c0a6f6b.jpg) + 资源预览 - 视频预览 ![视频预览](https://user-images.githubusercontent.com/50403161/233643649-abdaa4e1-f0a2-4219-8b4c-eab403c2885a.png) - 图片预览 ![图片预览](https://user-images.githubusercontent.com/50403161/233643039-d2612446-3b3e-4792-aa36-63a60e00e3b5.png) - pdf预览 ![pdf预览](https://user-images.githubusercontent.com/50403161/233643073-ef11c03e-5dba-42ce-927f-032af0277ef0.png) ## 待完成 - 视频文件转码进度展示 - 订阅分享消息推送 - 后台管理 - 链接后台下载 - 生成分享链接二维码 - 办公套件预览支持 - 音频文件预览支持 - 使用HDFS升级存储系统 - ...... ## 更新日志 + 使用hls 流播放实现了视频在线播放 2023.3 + 视频与图片缩略图支持 2023.4.3 ## 前端地址 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值