Rumah > pembangunan bahagian belakang > Golang > 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
Lepaskan: 2024-02-06 08:00:06
ke hadapan
1110 orang telah melayarinya

使用 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
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan