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

阅读 2.5k
3 个回答

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一下属性就能拿到了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏