Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bekomme ich multipart.File von multipart.Part in Go, ohne es auf der Festplatte zu speichern?

Wie bekomme ich multipart.File von multipart.Part in Go, ohne es auf der Festplatte zu speichern?

WBOY
WBOYnach vorne
2024-02-08 22:03:09634Durchsuche

Wie bekomme ich multipart.File von multipart.Part in Go, ohne es auf der Festplatte zu speichern?

Während des Go-Sprachentwicklungsprozesses stößt der Apple-Editor Apple häufig auf die Notwendigkeit, multipart.File aus dem multipart.Part-Objekt abzurufen, wenn das multipart-Paket zum Verarbeiten von Formular-Upload-Dateien verwendet wird. Das Multipart-Paket in der Standardbibliothek stellt jedoch nicht direkt eine Methode zum Abrufen von Multipart.File bereit, sondern speichert die Datei standardmäßig auf der Festplatte. Gibt es also eine Möglichkeit, diese Einschränkung zu umgehen und multipart.File direkt von multipart.Part abzurufen? Als Nächstes stellen wir Ihnen eine Methode vor, mit der Sie multipart.File von multipart.Part in Go abrufen können, ohne es auf der Festplatte zu speichern.

Frageninhalt

In meiner Go-API habe ich eine Funktion, die früher einwandfrei funktionierte, indem sie von r.Body 中提取 multipart.File übergeben wurde, wie unten gezeigt

file, handler, err := r.FormFile("file")

Ich verwende multipart.File zum Hochladen auf die S3-API mithilfe des Minio-Clients, wie unten gezeigt

err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)

Da ich nun zusätzliche Formulardaten hinzugefügt habe, kann ich r.Body scheinbar nicht mehr verwenden, um dies zu erreichen. Ich erhalte die Meldung „Fehler beim Abrufen der Formulardatei“, wie im folgenden Code gezeigt.

Basierend auf dieser Frage habe ich MultipartReader implementiert, um Formulardaten von multipart.Part abzurufen.

Der

-Teil hat kein multipart.File, daher muss ich diesen Teil implementieren, ohne ihn nach Möglichkeit auf die Festplatte zu schreiben und erneut zu lesen.

Das ist mein Code

var err error

start := time.Now()

const maxUploadSize = 500 * 1024 * 1024 // 500 Mb

var requiredByDate FileRequiredDateData

mr, err := r.MultipartReader()

if err != nil {
    log.Println(err)
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
}

for {
    part, err := mr.NextPart()

    // This is OK, no more parts
    if err == io.EOF {
        break
    }

    // Some error
    if err != nil {
        log.Println("multipart reader other error")
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    log.Println(part.FormName())

    if part.FormName() == "data" {

        log.Println("multipart reader found multipart form name data")

        decoder := json.NewDecoder(part)

        err = decoder.Decode(&requiredByDate)

        if err != nil {
            log.Println("error in decoding request body data")
            log.Println(err.Error())
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

    if part.FormName() == "file" {

        file, handler, err := r.FormFile("file") <-- error getting form file here

        if err != nil {
            log.Println("error getting form file")
            log.Println(err.Error())
            http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusInternalServerError)
            return
        }

        defer file.Close()

----

    err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)

        if err != nil {
            log.Println(err)
            http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
            return
        }

Workaround

Sie streamen bereits Teile des Formulars, Sie können es jetzt nicht aufrufen FormFile,您必须自己读取该文件。使用 part.Read 读取文件的字节,或者复制文件等。请注意,part 实现了 io.Reader, damit Sie es wie eine Datei lesen können.

Das obige ist der detaillierte Inhalt vonWie bekomme ich multipart.File von multipart.Part in Go, ohne es auf der Festplatte zu speichern?. 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