【问题标题】:Multipart File upload using Springfox and Swagger-ui使用 Springfox 和 Swagger-ui 进行多部分文件上传
【发布时间】:2015-10-03 21:19:12
【问题描述】:

我使用 Spring MVC 作为休息控制器,并且我使用 Springfox 将 Swagger-ui 与我的控制器集成。我想要一种能够通过 Swagger-ui 界面上传文件的方法。我只需要两个参数,一个长效的对象ID和要上传的文件。

@RestController
public class controller{
    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public void uploadFile(@RequestParam Long id,
                           @RequestParam MultipartFile file){
          //do some stuff
    }
}

我几乎尝试了所有方法,但无法显示文件上传按钮。但是,如果我这样做:

@RestController
public class Controller{
    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public void uploadFile(@RequestParam Long id,
                           @RequestPart File file){
         //do some stuff
    }
}

文件上传按钮出现,但在尝试上传文件时总是抛出 http 代码 415。此外,我需要输入是 MultipartFile,而不是常规文件。即使我将 @RequestPart 注释与 Multipart File 一起使用,选择要上传的文件按钮也不会出现。我怎样才能让它工作????甚至:

@RestController
public class Controller{
    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public void uploadFile(@RequestPart String metaData,
                           @RequestPart MultipartFile file){
        //do some stuff
    }
}

行不通。如果有人可以演练如何让这个按钮出现在 MultipartFile 中?我将永远感激不尽。

【问题讨论】:

  • 如果你设置正确的答案就好了。

标签: java spring spring-mvc file-upload swagger-ui


【解决方案1】:

我认为您在第二个 sn-p 中缺少 @RequestMappingconsumes 属性。看下面的例子

@RequestMapping(
    path = "/upload", 
    method = RequestMethod.POST, 
    consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> handleUpload(
        @RequestPart("file") MultipartFile file, 
        @RequestParam("someId") Long someId,         
        @RequestParam("someOtherId") Long someOtherId) { 
    return new ResponseEntity<>();
}

【讨论】:

    【解决方案2】:

    在我的情况下,我需要做两件事

    1. 我的 MultipartFile 请求参数必须命名为“文件”,否则 swagger-ui 不会显示文件上传输入控件
    @RequestParam("file") MultipartFile file
    
    1. 我必须注册以下 bean
    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver commonsMultipartResolver(){
        return new CommonsMultipartResolver();
    }
    

    【讨论】:

    • 感谢您的代码 sn-p。
      我使用了来自 SO link 的解决方案,但它暗示要为 Spring 使用 XML 配置,我试图避免这种情况 :)需要指出的是,在使用 Maven/Gradle/etc 时,您必须为 Apache Commons FileUpload 库添加依赖项(至少我必须这样做),否则 Spring IoC 系统无法检索到代理文件上传的 bean。
    • 就我而言,我不得不像原来的答案一样将@RequestParam 更改为@RequestPart。也许你应该编辑答案。 ty
    【解决方案3】:

    使用

    @RequestPart(required = true) MultipartFile file

    并且使用版本号 2.1.0 或最新版本,以前的版本存在错误。

    https://github.com/springfox/springfox/issues/786

    【讨论】:

      【解决方案4】:

      尝试对 MultipartFile 使用 @RequestPart 而不是 @RequestParam

      @RestController
      public class controller {
      
          @RequestMapping(value="/upload", method=RequestMethod.POST)
          public void uploadFile(@RequestParam Long id,
                             @RequestPart MultipartFile file) {
              //do some stuff
          }
      
      }
      

      【讨论】:

      • 这个答案不会添加以前的答案尚未提供的任何内容
      【解决方案5】:

      两件事...

      1. 消耗的值应该是"multipart/form-data"consumes="multipart/form-data"

      2. @RequestPart("file") @ApiParam(value="File", required=true) MultipartFile file

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-29
        • 2013-05-08
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        相关资源
        最近更新 更多