簡體   English   中英

Gin 服務 []byte 作為文件

[英]Gin serve []byte as file

我有一個帶有杜松子酒的 golang 后端。 它應該用作包含音頻文件的 ftp 服務器的代理。 所以我的客戶端應該能夠調用端點 /download/filepath ,然后 Golang 應用程序應該從 ftp 服務器獲取文件並將其作為文件(無流)返回。

我當前的解決方案是從 ftp 作為 []byte 讀取文件,並使用 ioutil.TempFile() 將其臨時寫入磁盤並使用 ctx.File() 返回該文件。

如果可能的話,我想跳過創建臨時文件的步驟。 那可能嗎? 也許有一種方法可以代理呼叫並將 http 呼叫直接連接到 ftp 呼叫?

注意我不控制客戶端應用程序,所以我不能改變它。

使用Context.Data寫入[]byte作為響應。

您還可以使用Context.DataFromReader直接從 FTP 響應復制到 HTTP 響應。

HTTP 響應是字節的 stream。 沒有辦法解決這個問題。

您可以在讀取文件時寫入ResponseWriter 它就像使用http.ResponseWriter一樣工作。

import "io"

//...

io.Copy(ctx.ResponseWriter, ftpReader)

在 gin 框架中向客戶端提供二進制文件,然后瀏覽器會在用戶點擊 API 時自動下載文件,服務器不需要將文件保存到服務器(無需保存 static 文件),然后使用此方法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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM