首頁 > 後端開發 > Golang > 使用 gin 時如何將檔案傳送到一個進程中的不同伺服器?

使用 gin 時如何將檔案傳送到一個進程中的不同伺服器?

WBOY
發布: 2024-02-06 08:00:06
轉載
1092 人瀏覽過

使用 gin 时如何将文件发送到一个进程中的不同服务器?

問題內容

我試圖透過建立 POST 請求並將其傳送到不同的伺服器。在我的過程中,我嘗試發送 3 個 POST,一個發送到第一台伺服器,其餘發送到另一台伺服器。 p>

但是它只適用於第一個 POST 請求,其餘請求得到 200 個程式碼,但檔案仍然是空的。我不熟悉 http 連接,我該如何修正我的程式? 如果您能幫助我,我將不勝感激!

這是接收檔案的函數。

func ReceivePublicKey() *gin.Engine {
    router := gin.Default()
    router.MaxMultipartMemory = 8 << 20
    //router.Static("/", "./static")
    router.POST("/receive", func(context *gin.Context) {
        file, _ := context.FormFile("file")
        log.Println(file.Filename)
        dst := "./" + file.Filename
        context.SaveUploadedFile(file, dst)
        context.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
        context.String(200, "server: receive publicKey successfully!")
    })
    return router
}
登入後複製

這是建立和發送請求的函數

func CreateSendFileReq(file *os.File, fileName string, url string) *http.Request {
    bodyBuf := &bytes.Buffer{}
    bodyWrite := multipart.NewWriter(bodyBuf)
    fileWrite, err := bodyWrite.CreateFormFile("file", fileName)
    _, err = io.Copy(fileWrite, file)
    if err != nil {
        log.Println("err")
    }
    bodyWrite.Close() 
    if err != nil {
        log.Println("err")
    }
    req, _ := http.NewRequest("POST", url, bodyBuf)
    req.Header.Set("Content-Type", bodyWrite.FormDataContentType())
    return req
}

func SendRequest(r *http.Request) *http.Response {
    client := &http.Client{}
    resp, err := client.Do(r)
    if err == nil {
        return resp
    } else {
        log.Fatal(err)
        return nil
    }
}
登入後複製

還有不起作用的功能

func IotInit() {
    privateFile, _ := os.Open("private.pem")
    publicFile, _ := os.Open("public.pem")
    userId := GenerateIotId(publicFile)
    fmt.Println(userId)
    sendPrivateToServer := Controller.CreateSendFileReq(privateFile, userId+".pem", "http://192.168.42.129:8090/receive")

    sendPublicToUser := Controller.CreateSendFileReq(publicFile, "public.pem", "http://localhost:8090/receive")

    resp := Controller.SendRequest(sendPublicToUser)
    if resp.StatusCode != 200 {
        log.Fatal(resp.StatusCode)
    }
    resp.Body.Close()

    sendPrivateToUser := Controller.CreateSendFileReq(privateFile, "private.pem", "http://localhost:8090/receive")

    resp = Controller.SendRequest(sendPrivateToServer)
    if resp.StatusCode != 200 {
        log.Fatal(resp.StatusCode)
    }
    resp.Body.Close()

    resp = Controller.SendRequest(sendPrivateToUser)
    if resp.StatusCode != 200 {
        log.Fatal(resp.StatusCode)
    }
    resp.Body.Close()

    publicFile.Close()
    privateFile.Close()
}
登入後複製

正確答案


好吧,現在我發現了我的錯誤。 首先,我沒有檢查文件的大小,這解釋了為什麼我在保存空文件時得到 200 代碼。 第二個在IotInit() 中取得userId 我使用了io.Copy() 並使檔案指標指向檔案結尾,這解釋了為什麼「public.pem」為空,我永遠不要將任何內容複製到請求體。此外,我在建立 POST 請求時使用 io.Copy(),「private.pem」也可能為空。

以上是使用 gin 時如何將檔案傳送到一個進程中的不同伺服器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板