Heim > Backend-Entwicklung > Golang > Wie kann ich bei Verwendung von Gin Dateien in einem Vorgang an verschiedene Server senden?

Wie kann ich bei Verwendung von Gin Dateien in einem Vorgang an verschiedene Server senden?

WBOY
Freigeben: 2024-02-06 08:00:06
nach vorne
1070 Leute haben es durchsucht

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

Frageninhalt

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
}
Nach dem Login kopieren

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
    }
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

Richtige Antwort


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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage