Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menghantar fail ke pelayan yang berbeza dalam satu proses apabila menggunakan gin?
Saya cuba melakukan ini dengan membuat permintaan POST dan menghantarnya ke pelayan lain. Dalam proses saya, saya cuba menghantar 3 POST, satu ke pelayan pertama dan selebihnya ke pelayan lain. p>
Tetapi ia hanya berfungsi pada permintaan POST yang pertama, permintaan selebihnya mendapat 200 kod tetapi fail masih kosong. Saya tidak biasa dengan sambungan http, bagaimana saya boleh membetulkan program saya? Saya akan sangat berterima kasih jika anda boleh membantu saya!
Ini ialah fungsi yang menerima fail.
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 }
Ini adalah fungsi yang mencipta dan menghantar permintaan
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 } }
Masih ada fungsi yang tidak berfungsi
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() }
Okay sekarang saya dapati kesilapan saya. Pertama, saya tidak menyemak saiz fail, yang menjelaskan mengapa saya mendapat kod 200 apabila menyimpan fail kosong. Yang kedua mendapat userId dalam IotInit() saya menggunakan io.Copy() dan membuat penunjuk fail menunjuk ke end of file, yang menjelaskan mengapa "public.pem" kosong, saya tidak pernah menyalin apa-apa kepada permintaan badan . Selain itu, saya menggunakan io.Copy() apabila membuat permintaan POST dan "private.pem" juga mungkin kosong.
Atas ialah kandungan terperinci Bagaimana untuk menghantar fail ke pelayan yang berbeza dalam satu proses apabila menggunakan gin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!