我試圖透過建立 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中文網其他相關文章!