问题记录:使用MultipartFile不上传文件出现异常

简介: 问题记录:使用MultipartFile不上传文件出现异常

前言:在使用Spring项目构建项目时,文件上传基本都是使用MultipartFile来获取的,但是若是不上传这个文件,或者不传就会导致将文件转化为MultipartFile类型时出错,最近开发的一个接口就是这种情况,提了接口测试,测试说不上传文件会报错,然后就必须得改,因为是为其他系统提供的服务支持,前后端一起提测的,所以接口单独测,这样就过不去,下面记录下这个坑,以后肯定还会碰到。


错误示例


下面先展示下错误的写法,这种写法应该是大家最为常用的了,使用参数绑定的方式直接将file文件转化为MultipartFile类型,然后操作,但是若是前端不传或者使用postman、jmeter等测试工具不上传文件时就会出错,这个出错是文件转化时就错了,还没到程序里面,那怎么办呢?


    @PostMapping("/ocr")
    public String syncRestOcr(@RequestParam("file") MultipartFile file) {
    /** Check file type */
        if (file == null || file.isEmpty()) {
            log.error("####***接口服务--OCR接口: 文件为空!");
            return returnAndClear(new ResultDTO(ExceptionEnum.PARAMS_NULL_30.getResultCode()), null, null);
        }
        /** Upload service and return resultDTO */
        if (!checkSuffix(file.getOriginalFilename())) {
            log.error("####***接口服务--OCR接口: 文件拓展名检测失败!");
            return returnAndClear(new ResultDTO(ExceptionEnum.SYSTEM_FILE_SUFFIX_TYPE_ERR.getResultCode()), null, null);
        }
     }


我们可以不使用参数绑定,直接接收HttpServetRequest 然后判断参数存在再转化为MutlipartFile类型,正确代码如下所示,这样就不会存在不上传文件时报异常了,我们就可以手动获取到这些异常场景来直接提示调用者。


@PostMapping("/ocr")
    public String OCR(HttpServletRequest request){
        log.info("##### ***接口服务--OCR接口执行开始 #####");
        MultipartFile file;
        if(ServletFileUpload.isMultipartContent(request))//判断参数是否是文件类型
            file = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class).getFile("file");//从request中拿file的值转化为MultipartFile
        else
            return returnAndClear((new ResultDTO(ExceptionEnum.COMMON_ERROR_30.getResultCode(),null,"请上传图片格式的文件(支持jpg、png)")),null,null);
        /** Check file type */
        if (file == null || file.isEmpty()) {
            log.error("####***接口服务--OCR接口: 文件为空!");
            return returnAndClear(new ResultDTO(ExceptionEnum.PARAMS_NULL_30.getResultCode()), null, null);
        }
        /** Upload service and return resultDTO */
        if (!checkSuffix(file.getOriginalFilename())) {
            log.error("####***接口服务--OCR接口: 文件拓展名检测失败!");
            return returnAndClear(new ResultDTO(ExceptionEnum.SYSTEM_FILE_SUFFIX_TYPE_ERR.getResultCode()), null, null);
  }


参考:https://blog.csdn.net/tian__kong/article/details/106791494

相关文章
|
JSON Java 数据格式
|
前端开发 应用服务中间件
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
3666 0
|
3月前
|
存储 JavaScript 前端开发
URL编码/解码 核心JS实现
这是一款基于Vue开发的轻量级URL编码/解码在线工具,纯前端实现,无需依赖外部库。利用`encodeURI`/`encodeURIComponent`及对应解码方法,支持一键编码、解码、清空与复制,并自动聚焦输入框,提升使用效率。
756 3
Springboot文件下载跨域问题解决方案
Springboot文件下载跨域问题解决方案
|
前端开发 JavaScript Java
SpringCloudGateway网关服务实现文件上传功能
SpringCloudGateway网关服务实现文件上传功能
746 7
|
算法 搜索推荐 Java
Java中的Sort
Java中的排序机制主要通过`Arrays.sort()`和`List.sort()`实现。`Arrays.sort()`支持多种排序算法,包括归并排序(`legacyMergeSort`)和TimSort。`legacyMergeSort`采用递归分割数组并合并的方式,适用于小规模数据的插入排序优化。TimSort则结合了归并排序和插入排序的优点,通过分段处理和合并优化排序性能,特别适合处理部分有序的数据。对于数值排序,Java还提供了`DualPivotQuicksort`算法。而`List.sort()`则是将列表转化为数组进行排序后再写回列表。
371 2
|
消息中间件 数据可视化 Java
SpringBoot3集成Kafka
SpringBoot3集成KafkaKafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集成和关键任务应用,基于Zookeeper协调的处理平台,也是一种消息系统,具有更好的吞吐量、内置分区、复制和容错。
1500 1
|
运维 Cloud Native Java
postman发起post请求遇到报错:java.io.FileNotFoundException (文件名、目录名或卷标语法不正确。)
遇到bug报错,多猜可能的原因,控制变量反复测试,直至找到问题的关键,然后再思考如何解决或者回避。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来
|
JSON 安全 Java
Spring Boot之全局异常处理:404异常为何捕获不到?
Spring Boot之全局异常处理:404异常为何捕获不到?
2640 0
Spring Boot之全局异常处理:404异常为何捕获不到?
|
机器学习/深度学习 人工智能 算法框架/工具
什么是CANN和Ascend C
CANN(Compute Architecture for Neural Networks)是华为推出的AI异构计算架构,支持多种AI框架如MindSpore、PyTorch等,适用于AI处理器与编程,旨在提升昇腾AI处理器的计算效率。CANN提供强大的图引擎、算子开发语言Ascend C、算子加速库AOL、集合通信库HCCL、毕昇编译器及Runtime运行时,支持快速构建AI应用,涵盖推理应用开发、模型训练和算子开发等关键功能。