Java Swagger(Springfox)注释用于流式传输多部分文件上传。

4
我们正在使用Spring控制器来处理文件上传:
例如:
@RequestMapping(value = "/scan", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ScanResult scan(HttpServletRequest request) throws IOException, FileUploadException {
    return scanService.scanFile(parseMultipart(request));
}

但我们没有使用任何多部分解析器,而是从servlet请求输入流中传输文件。出于性能原因,我们需要立即开始处理文件。

这样做时,我们似乎不能使用典型的多部分文件检测/配置。我知道Springfox(我们用它来生成我们的swagger文档)将为控制器参数看到MultipartFile时生成适当的swagger控件,这对我们来说不是这种情况。

是否有其他配置选项可用于提示Springfox我们要在此处上传文件?

3个回答

8

谢谢,这对我很有帮助!我在Springfox 2.9.2中遇到了这个问题。 - Abhi

7

在这里找到了答案:https://github.com/springfox/springfox/issues/1285

以下隐式参数给了我所需的东西:

@ApiImplicitParams (value = {
    @ApiImplicitParam(dataType = "file", name = "file", required = true,paramType = "form")}
@RequestMapping(value = "/scan", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ScanResult scan(HttpServletRequest request) throws IOException, FileUploadException {
    return scanService.scanFile(parseMultipart(request));
}

这将在API中添加一个简单的文件选择器。更加令人困惑的是,事实证明这个功能在我使用的Springfox 2.4版本中已经失效了。添加该注释并更新版本就是我需要做的全部。


非常感谢您的分享。对于任何未来的观察者,Springfox 2.7.0-SNAPSHOT破坏了这个功能,但在2.6.0中可以正常工作。 - jmrah

0

没错 https://dev59.com/FZzga4cB1Zd3GeqP-gIY#44385675

在控制器中应该是:

@ApiOperation(value = "Upload file", response = String.class)
    @ApiResponses({
            @ApiResponse(code = 500, message = "Internal Server Error"),
            @ApiResponse(code = 400, message = "Bad request")
    })
    @ApiImplicitParams (value = {
            @ApiImplicitParam(dataType = "__file", name = "fileData", required = true,paramType = "form")})
    @PostMapping(value = "/upload", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public ResponseEntity<?> uploadFileSimple(UploadFile form) {

        // Create folder to save file if not exist
        File uploadDir = new File(UPLOAD_DIR);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }

        MultipartFile fileData = form.getFileData();
        String name = fileData.getOriginalFilename();
        if (name != null && name.length() > 0) {
            try {
                // Create file
                File serverFile = new File(UPLOAD_DIR + "/" + name);
                BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));
                stream.write(fileData.getBytes());
                stream.close();
                return ResponseEntity.ok("/file/" + name);
            } catch (Exception e) {
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error when uploading");
            }
        }

        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Bad request");
    }

在模型中:

package com.xxx.xxx.request;
import lombok.*;
import org.springframework.web.multipart.MultipartFile;

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UploadFile {
    private MultipartFile fileData;
}

enter image description here


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