【发布时间】:2020-09-30 08:15:53
【问题描述】:
我正在尝试在 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
}
我错过了什么吗?
【问题讨论】:
-
您在浏览器接收到文件之后添加标题,将它们移动到
io.Copy之前以产生效果。此外,您在fmt.Sprintf调用中有错误的格式动词(只是%),请使用%q。其他的不清楚 -
@xarantolus 感谢一位朋友!有用! :) 现在,我看到了“下载文件”链接。请发布与答案相同的内容,以便我可以接受:) 还有一件事:文件下载是否在我单击“下载文件”链接之前开始?我不确定单击链接后是否开始下载。请帮忙,再次感谢
-
只有在您单击按钮后才应该开始下载,但这实际上取决于它是如何实现的(例如,可能存在在悬停时启动它的逻辑)。只有在您点击后才能收到请求
标签: rest go swagger swagger-2.0 go-gin