Maison  >  Article  >  développement back-end  >  Comment envoyer des fichiers à différents serveurs en un seul processus lors de l'utilisation de gin ?

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

WBOY
WBOYavant
2024-02-06 08:00:061049parcourir

使用 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
}

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer