Heim >Backend-Entwicklung >Golang >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.
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.
-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 }
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!