You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Swagger中生成返回可下载文件(PDF)的API文档?

如何在Swagger中正确表示Spring文件下载接口的响应

我完全懂你的困扰——默认情况下Swagger会把InputStreamResource当成普通Java对象解析,展示它的JSON结构,但这完全不是文件下载接口该有的文档效果。其实只需要调整Swagger的注解,明确告诉它这个接口返回的是二进制文件流就行,下面是具体的解决方法:

核心解决方案:用@ApiResponse明确响应类型

你需要在@ApiResponse里通过@Content@Schema注解,指定响应的媒体类型和文件格式,而非依赖Swagger自动解析返回值类型。

代码示例(适配Swagger 3.x/Springdoc)

修改后的接口注解应该是这样的:

@ApiOperation(value = "根据ID获取PDF文件")
@ApiResponses(value = {
    @ApiResponse(
        code = 200,
        message = "成功返回可下载的PDF文件",
        content = @Content(
            mediaType = "application/pdf",
            schema = @Schema(type = "string", format = "binary")
        )
    )
})
@GetMapping(produces = "application/pdf")
ResponseEntity<InputStreamResource> find(@PathVariable long id);

关键注解说明

  • @Content(mediaType = "application/pdf"):和接口produces属性保持一致,明确响应的媒体类型是PDF
  • @Schema(type = "string", format = "binary"):告诉Swagger这是一个二进制字符串(即文件流),这样Swagger UI就会生成一个下载按钮,而非展示InputStreamResource的JSON结构

可选优化:补充响应头说明

如果你的接口会返回Content-Disposition头部(用来指定文件名和下载方式),可以在注解里加上响应头的说明,让文档更完整:

@ApiResponse(
    code = 200,
    message = "成功返回可下载的PDF文件",
    content = @Content(
        mediaType = "application/pdf",
        schema = @Schema(type = "string", format = "binary")
    ),
    headers = {
        @Header(name = "Content-Disposition", description = "指定文件下载的文件名和方式,示例:attachment; filename=\"document.pdf\"", schema = @Schema(type = "string"))
    }
)

适配Swagger 2.x(Springfox)的写法

如果你还在使用Springfox版本的Swagger,写法略有调整,同样可以明确响应类型:

@ApiOperation(value = "根据ID获取PDF文件")
@ApiResponses(value = {
    @ApiResponse(code = 200, message = "成功返回PDF文件",
        responseHeaders = @ResponseHeader(name = "Content-Disposition", description = "文件下载头部", response = String.class),
        content = @Content(mediaType = "application/pdf", schema = @Schema(type = "string", format = "binary"))
    )
})
@GetMapping(produces = "application/pdf")
ResponseEntity<InputStreamResource> find(@PathVariable long id);

修改后的效果

调整完注解后,Swagger UI里这个接口的响应部分会显示为application/pdf类型,并且提供一个下载按钮,点击就能直接触发文件下载,完全符合接口的实际功能。

内容的提问来源于stack exchange,提问作者Dherik

火山引擎 最新活动