实现并解决微服务间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-Type 为 multipart/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 类型,可以很容易地访问上传的文件。
相关推荐
吴建旭 智宅焕21 分钟前
智能家居全国交付中报价工具与交付基础设施的架构分离设计:接口化路径与交付确定性系统实现
架构·智能家居
你看我名字31 分钟前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
xbzb1 小时前
Docker 架构与部署:一条 docker run 到底走了三层
docker·容器·架构·镜像·加速·daemon
Decay__1 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
安易算力7 小时前
Token计费系统设计与优化:算力API的后端架构实践
架构
Decay__10 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
一只爱撸猫的程序猿11 小时前
我看着一个 AI 引擎在 14 天里,从"记忆"走进了"搜索"
人工智能·后端·架构
Dawson Zhu15 小时前
从空间 Scaling 到时间 Scaling
人工智能·语言模型·架构·aigc·agi
分布式存储与RustFS20 小时前
OpenSearch 的索引快照别只留本地:用 repository-s3 存进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
say_fall21 小时前
【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工
服务器·人工智能·架构