Maison > développement back-end > Golang > le corps du texte

Comment envoyer des fichiers à différents serveurs en un seul processus lors de l'utilisation de gin ?

WBOY
Libérer: 2024-02-06 08:00:06
avant
1054 Les gens l'ont consulté

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

Contenu de la question

J'essaie de le faire en créant une requête POST et en l'envoyant à un autre serveur. Dans mon processus, j'essaie d'envoyer 3 POST, un au premier serveur et le reste à un autre serveur. p>

Mais cela ne fonctionne que pour la première requête POST, le reste des requêtes obtiennent 200 codes mais le fichier est toujours vide. Je ne suis pas familier avec les connexions http, comment puis-je corriger mon programme ? Je vous serais très reconnaissant si vous pouviez m'aider !

C'est la fonction qui reçoit le fichier.

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
}
Copier après la connexion

C'est la fonction qui crée et envoie la requête

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
    }
}
Copier après la connexion

Il y a encore des fonctions qui ne fonctionnent pas

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()
}
Copier après la connexion

Bonne réponse


D'accord, maintenant j'ai trouvé mon erreur. Premièrement, je n'ai pas vérifié la taille du fichier, ce qui explique pourquoi j'ai obtenu le code 200 lors de l'enregistrement d'un fichier vide. Le second obtient l'userId dans IotInit() J'ai utilisé io.Copy() et j'ai fait pointer le pointeur de fichier vers fin du fichier, ​​ce qui explique pourquoi "public.pem" est vide, je ne copie jamais rien dans la requête corps . De plus, j'utilise io.Copy() lors de la création de la requête POST et "private.pem" peut également être vide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal