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

Gin 服务 []byte 作为文件

Gin 服务 []byte 作为文件

Go
aluckdog 2022-06-06 15:33:53
我有一个带有杜松子酒的 golang 后端。它应该作为包含音频文件的 ftp 服务器的代理。因此,我的客户端应该能够调用端点 /download/filepath,然后 Golang 应用程序应该从 ftp 服务器获取文件并将其作为文件(无流)返回。我目前的解决方案是从 ftp 中读取文件为 []byte 并使用 ioutil.TempFile() 将其临时写入磁盘并使用 ctx.File() 返回该文件。如果可能的话,我想跳过创建临时文件的步骤。那可能吗?也许有一种方法可以代理呼叫并将 http 呼叫直接连接到 ftp 呼叫?注意我不控制客户端应用程序,所以我不能改变它。
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

使用Context.Data写入 a[]byte作为响应。

您还可以使用Context.DataFromReader直接从 FTP 响应复制到 HTTP 响应。

HTTP 响应是字节流。没有办法解决这个问题。


查看完整回答
反对 回复 2022-06-06
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

在gin框架中向客户端提供二进制文件,然后浏览器在用户点击API时自动下载文件,服务器不需要将文件保存到服务器(无需保存静态文件),然后使用此方法c.Data。其中第三个参数的数据类型为[]byte。我希望这个答案对每个人都有用并且更容易理解。这是一个示例代码。


func DownloadFile(c *gin.Context) {

    byteFile, err := ioutil.ReadFile("./file.txt")

    if err != nil {

        fmt.Println(err)

    }


    c.Header("Content-Disposition", "attachment; filename=file-name.txt")

    c.Data(http.StatusOK, "application/octet-stream", byteFile)

}


查看完整回答
反对 回复 2022-06-06
?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以ResponseWriter在读取文件时写入。它的工作原理就像使用http.ResponseWriter.


import "io"


//...


io.Copy(ctx.ResponseWriter, ftpReader)


查看完整回答
反对 回复 2022-06-06
  • 3 回答
  • 0 关注
  • 371 浏览
慕课专栏
更多

添加回答

举报

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