当前位置: 首页 > 知识库问答 >
问题:

如何提供昂首阔步的注释MultipartFormDataInput在RestEasy与QUUKUS

赖星驰
2023-03-14

在使用RestEasy框架处理Quarkus时,我可以使用MultipartFormDataInput上传文件。此功能按预期工作,但我无法为swagger UI提供适当的OpenAPI注释。我尝试了多种选择和组合,但没有结果。请帮帮我。我在下面提供示例html" target="_blank">代码。

@Operation(summary = "Upload a single file", description = "Upload a single file")
    @APIResponses({
            @APIResponse(responseCode = "200", description = "Upload file successfully"),
            @APIResponse(name = "500", responseCode = "500", description = "Internal service error") })
    @RequestBody(content = @Content(
            mediaType = MediaType.MULTIPART_FORM_DATA,
            schema = @Schema(type = SchemaType.STRING, format = "binary"),
            encoding = @Encoding(name = "attachment", contentType = "application/octet-stream")))
    @POST
    @Path("/singleFile")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.TEXT_PLAIN)
    public Response handleFileUpload(@MultipartForm MultipartFormDataInput input) {
        String fileName = null;

        Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
        // Get file data to save
        List<InputPart> inputParts = uploadForm.get("attachment");
        for (InputPart inputPart : inputParts) {
            try {
                MultivaluedMap<String, String> header = inputPart.getHeaders();
                fileName = getFileName(header);
                InputStream inputStream = inputPart.getBody(InputStream.class, null);
                byte[] bytes = IOUtils.toByteArray(inputStream);
                File customDir = new File(UPLOAD_DIR);
                if (!customDir.exists()) {
                    customDir.mkdir();
                }
                fileName = customDir.getCanonicalPath() + File.separator + fileName;
                Files.write(Paths.get(fileName), bytes, StandardOpenOption.CREATE);
                return Response.status(200).entity("Uploaded file name : " + fileName).build();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return Response.status(200).entity("Uploaded file name : " + fileName).build();
    }

我还提到了以下链接。

https://community.smartbear.com/t5/Swagger-Open-Source-Tools/How-to-swagger-annotate-multipart-form-data-with-resteasy/td-p/178776

https://github.com/swagger-api/swagger-core/issues/3050

如果我使用@Schema(type=SchemaType.STRING,format=“binary”)和@PartType(MediaType.APPLICATION\u OCTET\u STREAM)注释创建一个名为MultipartBody的单独类,我就能够生成swagger UI。但我的要求是只使用MultipartFormDataInput

共有1个答案

裴凯定
2023-03-14

您几乎做到了:)只需在RequestBody/Schema中使用一个专用类,并告诉OpenAPI忽略方法的参数。

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@RequestBody(content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA,
    schema = @Schema(implementation = MultipartBody.class))
)
@Operation(operationId = "uploadFile")
public Response uploadFile(@Parameter(hidden = true) MultipartFormDataInput input) {
//... your logic here
}

需要注意的两件事:@Parameter(隐藏=true)告诉Smallrye OpenAPI在生成模式模型时不要考虑您的MultipartFormDataInput。然后你需要告诉显式描述模式,使用@recestBody,其中MultipartBody是一个类,它描述了你所有的输入参数(你可以在那里添加更多的参数,如果你想例如传递其他道具和文件负载)

public class MultipartBody {

    @FormParam("file")
    @Schema(type = SchemaType.STRING, format = "binary", description = "file data")
    public String file;


    @FormParam("fileName")
    @PartType(MediaType.TEXT_PLAIN)
    public String fileName;
}

只要确保MultipartBody中的@FormParam注释字段与您期望在MultipartFormDataInput中找到的,,部分相匹配-例如,在您的情况下,文件属性应该具有@FormParam(附件)

 类似资料:
  • 问题内容: 我想知道如何用昂扬的方式记录枚举。 根据JavaDoc 数据类型。请参阅文档以获取受支持的数据类型。如果数据类型是自定义对象,请设置其名称,或不设置任何名称。如果是枚举,请为枚举常量使用’string’和allowableValues。 但是我没有找到一些好的Java示例如何真正使用它,规范在这里。 第一服务 第二服务 输入项 天 输出量 pom.xml 您可以在此处查看结果。 我看到

  • 数据类型。有关支持的数据类型,请参见文档。如果数据类型是自定义对象,请设置它的名称,或者不设置任何名称。对于枚举,使用'string'和allowableValues作为枚举常量。 但是我没有找到一些好的Java示例如何真正使用它,规范在这里。 你可以在这里看到结果。 我认为是个问题... 你知道吗?

  • 我们正在为我们的Laravel REST API实现开发Swagger文档。几个POSTendpoint将使用CSV作为参数内容类型。 Swagger中是否有一种方法可以让“立即尝试”功能与CSV POST文件上传一起使用? 下面是我们的留档http://api.curvecompass.com/docs/#/ 我们的Laravel POST函数可以正确地与CSVendpoint一起工作,而不是与

  • 问题内容: 我正在尝试使用swagger定义post端点,但是不允许使用该参数: 当我跑步时,我得到这个: 我的规格有什么问题? 问题答案: 您可能正在混合使用OpenAPI / Swagger 2.0和OpenAPI 3.0语法。您的规格似乎是2.0,但是关键字是3.0功能。在2.0中,请求正文被定义为正文参数: 更多信息:描述请求正文

  • 我正在努力找到配置基本路径的方法。 我想配置基本路径服务器端 我正在使用OpenAPI生成器从一个招摇过市的endpoint(asp核心web api)生成SUB 是否有方法配置不同的基本路径。

  • 这不是springfox的故事,这是springdoc-openapi的故事。 我当前的依赖项 我的物业 此处请求(localhost:8080/swagger-ui.html)我的服务器响应swagger-petstore示例我已经知道petstore-disable(springdoc.swagger-ui.disable-swagger-default-url=true),但它不起作用 另一