Heim >Backend-Entwicklung >Golang >Wie kann ich bei Verwendung von Gin Dateien in einem Vorgang an verschiedene Server senden?
Ich versuche dies zu erreichen, indem ich eine POST-Anfrage erstelle und diese an einen anderen Server sende. In meinem Prozess versuche ich, drei POSTs zu senden, einen an den ersten Server und den Rest an einen anderen Server. p>
Aber es funktioniert nur für die erste POST-Anfrage, die restlichen Anfragen erhalten 200 Codes, aber die Datei ist noch leer. Ich kenne mich mit http-Verbindungen nicht aus, wie kann ich mein Programm korrigieren? Ich wäre Ihnen sehr dankbar, wenn Sie mir helfen könnten!
Dies ist die Funktion, die die Datei empfängt.
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 }
Dies ist die Funktion, die die Anfrage erstellt und sendet
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 } }
Es gibt immer noch Funktionen, die nicht funktionieren
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() }
Okay, jetzt habe ich meinen Fehler gefunden. Erstens habe ich die Größe der Datei nicht überprüft, was erklärt, warum ich beim Speichern einer leeren Datei den Code 200 erhalten habe. Der zweite erhält die Benutzer-ID in IotInit(). Ich habe io.Copy() verwendet und den Dateizeiger auf das Ende der Datei zeigen lassen, was erklärt, warum „public.pem“ leer ist, ich kopiere nie etwas in die Anfrage Körper . Außerdem verwende ich io.Copy() beim Erstellen der POST-Anfrage und „private.pem“ ist möglicherweise auch leer.
Das obige ist der detaillierte Inhalt vonWie kann ich bei Verwendung von Gin Dateien in einem Vorgang an verschiedene Server senden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!