为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Swag golang 库下载文件?

如何使用 Swag golang 库下载文件?

Go
慕婉清6462132 2022-07-04 16:48:32
我正在尝试在golang中使用gin-gonic制作一个REST API ,它从GET请求中获取一些路径参数并下载该文件。curl命令可以正常工作。但是,当我添加swagger UI文档时,如果下载的文件是文本或图像,它只是显示在该网页中,但我看不到任何下载选项。如果我输入视频文件的路径,浏览器会挂起。此外,要下载的文件的MIME类型由gin-gonic正确确定。但是,要通过swagger UI 界面下载文件,我使用的是硬编码的 @Accept和@Produce swagger UI 注释注释。理想情况下,它应该自动确定 MIME 类型。目前,响应类型被列为下拉列表,我可以在其中获得各种选项。我需要它来自动检测正确的 MIME 类型并尽可能显示下载按钮我的 GET 请求代码是:// DownloadObject godoc// @Summary Download object// @Description Download object// @Produce application/json// @Produce text/plain// @Produce application/octet-stream// @Produce video/mp4// @Produce image/png// @Produce image/jpeg// @Produce image/gif// @Param rootPath path string true "Root Path"// @Param filePath path string true "File Path"// @Header 200 {string} Token "qwerty"// @Router /transfer/{rootPath}/{filePath} [get]func DownloadObject(c *gin.Context) {    // Get rootPath & filePath from GET request    rootPath := c.Param("rootPath")    filePath := c.Param("filePath")    // Some code to get an io.Reader object "download"    _, err = io.Copy(c.Writer, download)    if err != nil {        c.Status(http.StatusInternalServerError)        log.Print(err)        return    }    err = download.Close()    if err != nil {        c.Status(http.StatusInternalServerError)        log.Print(err)        return    }        c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%", filePath))    c.Writer.Header().Add("Content-Type", c.GetHeader("Content-Type"))    // Object download completed & closed successfully}我在这里错过了什么吗?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您在浏览器接收到文件后添加标题,将它们移到之前io.Copy以使它们生效。此外,您在通话中有一个错误的格式动词(只是%),fmt.Sprintf请使用%q:


func DownloadObject(c *gin.Context) {


    // Get rootPath & filePath from GET request

    rootPath := c.Param("rootPath")

    filePath := c.Param("filePath")


    // ...


    // Add headers to the response

    c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%q", filePath))

    c.Writer.Header().Add("Content-Type", c.GetHeader("Content-Type"))



    _, err = io.Copy(c.Writer, download)

    if err != nil {

        c.Status(http.StatusInternalServerError)

        log.Print(err)

        return

    }


    err = download.Close()

    if err != nil {

        c.Status(http.StatusInternalServerError)

        log.Print(err)

        return

    }

    

}


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信