如何解决使用 Swagger-UI 将 MultipartFile 对象数组上传到 Spring Boot 应用程序?
我正在尝试上传 .pdf
/.docx
/.whatever
数组。
根据 Swagger 的 docs,它们确实允许发送文件数组。我只是不知道如何告诉 Swagger-UI
创建这种请求。
我对 Swagger
有以下依赖项(不确定这是指 OAS2
还是 OAS3
):
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
这是我的 SwaggerConfig
类(放置在 main
Spring Boot 函数的包中):
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket swaggerPlugin() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.paths(PathSelectors.any())
.apis(RequestHandlerSelectors.any())
.build()
.securitySchemes(Arrays.asList(apiKey()))
.securityContexts(Arrays.asList(securityContext()))
.apiInfo(MetaData());
}
private ApiInfo MetaData() {
return new ApiInfoBuilder()
.title("Spring Boot REST API - Garbage Collectors App")
.description("*")
.version("1.0.0")
.license("Apache License Version 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build();
}
@Bean
public SecurityConfiguration security() {
return SecurityConfigurationBuilder.builder().scopeSeparator(",")
.additionalQueryStringParams(null)
.useBasicAuthenticationWithAccessCodeGrant(false).build();
}
private ApiKey apiKey() {
return new ApiKey("apiKey","Authorization","header");
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth())
.forPaths(PathSelectors.any()).build();
}
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope(
"global","accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Arrays.asList(new SecurityReference("apiKey",authorizationScopes));
}
@Bean
UiConfiguration uiConfig() {
return UiConfigurationBuilder.builder()
.deepLinking(true)
.displayOperationId(false)
.defaultModelsExpandDepth(1)
.defaultModelExpandDepth(1)
.defaultModelRendering(ModelRendering.EXAMPLE)
.displayRequestDuration(true)
.docExpansion(DocExpansion.NONE)
.filter(false)
.maxdisplayedTags(null)
.operationsSorter(OperationsSorter.ALPHA)
.showExtensions(false)
.tagsSorter(TagsSorter.ALPHA)
.supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)
.validatorUrl(null)
.build();
}
}
此外,这是我正在使用的控制器:
@ApiParam(allowMultiple=true)
@RequestMapping(value = "/send/email",consumes = {"multipart/form-data"},method = RequestMethod.POST)
public String sendEmail(@RequestParam("attachments") multipartfile[] attachments) throws IOException {
System.out.println(attachments.length);
return "test";
}
但发送请求后,我收到以下错误:
{
"timestamp": "2020-12-22T18:29:29.578+00:00","status": 400,"error": "Bad Request","trace": "org.springframework.web.multipart.support.MissingServletRequestPartException: required request part 'attachments' is not present org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:199)\r\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)\r\n\tat org.springframework.web.method.support.invocableHandlerMethod.getmethodArgumentValues(invocableHandlerMethod.java:170)\r\n\tat org.springframework.web.method.support.invocableHandlerMethod.invokeForRequest(invocableHandlerMethod.java:137)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletinvocableHandlerMethod.invokeAndHandle(ServletinvocableHandlerMethod.java:106)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\r\n\tat
}
另一方面,单个 multipartfile
上传和任意数量的单独预先确定的 multipartfile 可以毫无问题地上传。
我还尝试了什么:
-从里到外浏览谷歌
- 阅读文档:在 here 中,我可以看到他们解决了这个问题,但我仍然不知道如何告诉 Swagger-UI 发出我在服务器端指定的请求,无论如何我使用哪个依赖版本。
- 尝试像这样设置 application.ymal
:
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
orderId:
type: integer
userId:
type: integer
fileName:
type: string
format: binary
另外,我已经尝试了这两个依赖项:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
我的最后一个解决方案是允许发送最多 2-3 个 multipartfile
,但我真的很想避免这种情况。我该如何配置?
解决方法
您不能在 Swagger 2.x 中执行此操作。根据 Swagger 文档。
但是,不支持上传任意数量的文件(文件数组)。 https://github.com/OAI/OpenAPI-Specification/issues/254 有一个开放的功能请求。目前,您可以使用二进制字符串数组作为上传任意数量文件的解决方法:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。