Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menghantar fail ke pelayan yang berbeza dalam satu proses apabila menggunakan gin?

Bagaimana untuk menghantar fail ke pelayan yang berbeza dalam satu proses apabila menggunakan gin?

WBOY
WBOYke hadapan
2024-02-06 08:00:061049semak imbas

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

Kandungan soalan

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()
}

Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam