使用Springfox和Swagger-ui进行多部分文件上传

31

我正在使用Spring MVC作为REST控制器,并使用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 而不是普通的 File。即使我使用 @RequestPart 注释和 MultipartFile,选择要上传的文件按钮也不会出现。我该如何让它工作?

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

无法工作。如果有人能够提供如何使得这个按钮在MultipartFile中出现的步骤说明,我将感激不尽。


如果您设置正确的答案,那就太好了。 - Emilio Numazaki
5个回答

28

我认为您在第二个片段中缺少@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<>();
}

14

12

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

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

1
感谢您的代码片段。<br/>我使用了SO链接中的解决方案,但它意味着要使用Spring的XML配置,而我正试图避免这样做 :) 需要指出的是,在使用Maven/Gradle等工具时,您必须添加Apache Commons FileUpload库的依赖项(至少我必须这样做),否则Spring IoC系统无法检索到委托文件上传的bean。 - mginius
3
在我的情况下,我不得不将@RequestParam更改为@RequestPart,就像原始答案一样。也许你应该编辑答案。谢谢。 - Hosseinmp76

9

建议在处理 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
    }

}

此回答并未补充任何之前已经提供的内容。 - achingfingers

6

两件事...

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接