用于流式多部分文件上载的Java Swagger(Springfox)注解

bgibtngc  于 2022-11-06  发布在  Java
关注(0)|答案(3)|浏览(163)

我们使用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文档)会生成适当的swagger控件,如果它把一个MultipartFile作为一个控制器参数,这对我们来说不是这样的。
是否有其他配置选项可以提示springfox我们希望在这里上传文件?

qlzsbp2j

qlzsbp2j1#

关于Springfox v2.7.0中的突破性变更:
您需要使用dataType = "__file",而不是https://github.com/springfox/springfox/issues/1285中注解的file

ykejflvf

ykejflvf2#

在这里找到了我的答案: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中被破坏了--我正在使用的版本。添加注解和更新版本是我所需要做的。

zpgglvta

zpgglvta3#

没错https://stackoverflow.com/a/44385675/3810914
在控制器中,它应该是:

@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;
}

相关问题