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
WBOYnach vorne
2024-02-06 08:00:061068Durchsuche

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen