实现并解决微服务间OpenFeign转发文件格式MultipartFile

场景

使用openfeign转发MultipartFile类型的文件时出现了下面的错误。

java 复制代码
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ApiOperation(value = "导入")
public ResponseJson<String> uploadFiles(@RequestParam("files") MultipartFile[] files) {
    for (MultipartFile file : files) {
        if (!isExcelFile(file)) {
            return ResponseJson.fail("文件格式错误. 只支持.xls和.xlsx文件格式");
        }
    }
}
log 复制代码
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

分析原因后发现,请求中并没有正确设置请求头部中 Content-Typemultipart/form-data的类型。

multipart/form-data 是一种 HTTP 请求的内容类型(Content-Type),它被设计用来支持文件上传以及提交表单数据。

解决

对于文件格式,Spring提供了用于处理文件上传的注解@RequestParam,只需要将@RequestPart即可解决问题。

openFeign接口代码:

java 复制代码
@FeignClient(name = "anti-fraud-web-ruleDesign",path = "/calculationTemplate")
public interface CalculationTemplateClient {
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    ResponseJson<String> uploadFiles(@RequestPart("files") MultipartFile[] files);
}

被调用服务接口:

java 复制代码
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ApiOperation(value = "导入")
public ResponseJson<String> uploadFiles(@RequestPart("files") MultipartFile[] files) {
    for (MultipartFile file : files) {
        if (!isExcelFile(file)) {
            return ResponseJson.fail("文件格式错误. 只支持.xls和.xlsx文件格式");
        }
    }
}

@RequestParam@RequestPart的区别

在 Spring Framework 中,@RequestParam@RequestPart 是处理客户端到服务器的请求数据时使用的两个不同的注解,它们在多部分文件上传和表单数据处理方面有着明显的区别。

  1. @RequestParam

    • 用途:主要用于处理来自查询参数(URL)或表单数据(application/x-www-form-urlencoded)的简单请求参数。
    • 数据类型:通常用于处理文本类型的数据,如 String、Integer 等。
    • 文件上传 :虽然可以用于处理 multipart/form-data 类型的文件上传,但不是专门为此设计的。当用于文件时,通常需要将文件内容转换为字节数组或字符串。
  2. @RequestPart

    • 用途 :专门用于处理 multipart/form-data 请求,即文件上传请求。
    • 数据类型 :可以处理复杂对象,如 MultipartFile 或用户自定义的对象。它允许直接将请求的一部分映射到一个对象上,这在处理文件上传时非常有用。
    • 文件上传 :是处理 multipart/form-data 中文件的理想选择,直接支持 MultipartFile 类型,可以很容易地访问上传的文件。
相关推荐
Flittly18 小时前
【AgentScope Java新手村系列】(3)工具系统
java·spring boot·spring
小短腿的代码世界18 小时前
QtitanRibbon 深度解析:工业级Ribbon界面框架的架构设计与自定义扩展
qt·3d·架构
云烟成雨TD19 小时前
Spring AI 1.x 系列【59】容器化开发支持:Docker Compose 与 Testcontainers
人工智能·spring·docker
老码观察19 小时前
事件驱动架构从概念到落地——让系统像神经反射一样响应变化
架构
Flittly19 小时前
【AgentScope Java新手村系列】(2)第一个Agent-基础对话
java·spring boot·spring·ai
摇滚侠19 小时前
Spring MVC 不是一个单独的框架,是 Spring 框架的一个模块
java·spring·mvc
隔窗听雨眠20 小时前
原生一体化多模态大模型技术研究:从拼接到统一的架构革命
人工智能·架构
星辰徐哥20 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops
小短腿的代码世界20 小时前
Qt D-Bus深度解析:跨进程通信高级架构与源码实现
qt·架构·系统架构
名不经传的养虾人20 小时前
从0到1:企业级AI项目迭代日记 Vol.44|功能建好,和功能接通,是两件完全不同的事
人工智能·架构·agent·ai编程·企业ai