SpringMVC 开发接口,如何在上传文件的同时通过 query 传递参数?

@PostMapping(value = "/staticFile", consumes = {"multipart/form-data"})    

public JsonEntity<UploadFeedbackBO> uploadStaticFile(@RequestPart(value = "file") MultipartFile file

, @RequestParam(required = false) String subPath)

我是这样写的,但是启动项目后,swagger-ui 里面 subPath 在 formData 里面。
版本:swagger 2.9.2, springboot 2.3.1


回答:

Swagger 2.x这个版本的 Swagger 不支持将 @RequestParam@RequestPart 注解混合使用来上传文件和表单参数。如果你想要在 Swagger 页面中将 subPath 参数显示到表单中(而不是在文件上传部分),可以尝试以下几种方法:

1.升级到 Swagger 3.x

Swagger 3.x 支持使用 @Parameterin 属性来指定参数在请求体中的位置,从而可以自定义表单和文件上传。你可以在你的代码中添加如下配置,使用 @Parameter 注解来指定参数位置:

@PostMapping(value = "/staticFile", consumes = {"multipart/form-data"})

@Operation(summary = "上传静态资源文件")

public JsonEntity<UploadFeedbackBO> uploadStaticFile(@RequestPart(value = "file") MultipartFile file,

@Parameter(in = ParameterIn.QUERY, name = "subPath", description = "子路径", example = "abc") @RequestParam(required = false) String subPath) {

// handle file upload...

}

在上面的代码中,我们使用了 @Parameter 注解来指定 subPath 参数的位置为 QUERY,这样 Swagger 就会将它显示到表单的 QUERY 参数中。

需要注意的是,Swagger 3.x 的配置方式和 2.x 不同,你需要在 pom.xml 中引入 springdoc-openapi-uispringdoc-openapi-webmvc-core,然后添加相应的配置。

2.使用 Swagger 注解扩展

如果你无法升级 Swagger 版本,则可以尝试使用 Swagger 注解扩展来解决这个问题。具体来说,你可以自定义一个注解,用来指定参数在表单中的位置,然后在控制器中使用这个自定义注解来绑定参数。

代码示例如下:

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

@Parameter(in = ParameterIn.QUERY)

public @interface FormParam {

String value() default "";

}

在上面的代码中,我们定义了一个 @FormParam 注解,用来指定参数在表单中的位置。然后,我们可以在控制器中使用 @FormParam 注解来绑定表单参数。

@PostMapping(value = "/staticFile", consumes = { "multipart/form-data" })

public JsonEntity<UploadFeedbackBO> uploadStaticFile(@RequestPart(value = "file") MultipartFile file,

@FormParam("subPath") String subPath) {

// handle file upload...

}

在上面的代码中,我们使用 @FormParam 注解来指定 subPath 参数在表单中的位置。注意,这里我们不需要使用 @RequestParam 注解来指定参数位置,因为 Swagger 自定义注解已经包含了这个信息。

需要注意的是,这种方法需要你自定义一个注解,并且在控制器中使用这个自定义注解来绑定参数。因此,当你的表单参数名称过多时,代码量可能会比较大。


回答:

将@RequestPart 替换为 @RequestParam


回答:

封装一个对象,包含MultipartFile和String类型的属性,Controller中用这个对象接收,不需要加@RequestParam注解,get一下属性就能拿到了。

以上是 SpringMVC 开发接口,如何在上传文件的同时通过 query 传递参数? 的全部内容, 来源链接: utcz.com/p/945098.html

回到顶部