php小編蘋果在Go語言開發過程中,使用multipart套件處理表單上傳檔案時,常常會遇到需要從multipart.Part物件中取得multipart.File的需求。然而,標準函式庫中的multipart套件並沒有直接提供取得multipart.File的方法,而是預設將檔案儲存到磁碟中。那麼,有沒有辦法繞過這個限制,直接從multipart.Part取得multipart.File呢?接下來,我們將為大家介紹一種方法,實作在Go中從multipart.Part取得multipart.File而不儲存到磁碟的技巧。
在我的go API 中,我有一個以前透過從r.Body
中提取multipart.File
工作得很好的函數,如下圖
file, handler, err := r.FormFile("file")
我使用 multipart.File
使用 minio 用戶端上傳到 s3 API,如下所示
err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)
現在我添加了額外的表單數據,似乎無法再使用 r.Body 來實現此目的。我收到“獲取表單文件時出錯”的信息,如下面的程式碼所示。
根據這個問題,我實作了 MultipartReader
以從 multipart.Part 取得表單資料。
部分沒有 multipart.File
因此我需要在不將該部分寫入磁碟並在可能的情況下再次讀取的情況下實現該部分。
這是我的程式碼
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 }
您已經在串流表單的各個部分,您現在無法呼叫 FormFile
,您必須自己讀取該檔案。使用 part.Read
讀取檔案的字節,或複製檔案等。請注意,part
實作了 io.Reader
,因此您可以像讀取檔案一樣從中讀取內容。
以上是如何在Go中從multipart.Part取得multipart.File而不儲存到磁碟?的詳細內容。更多資訊請關注PHP中文網其他相關文章!