Maison > Article > développement back-end > Comment envoyer des fichiers à différents serveurs en un seul processus lors de l'utilisation de gin ?
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() }
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!