首頁  >  文章  >  後端開發  >  如何在Go中從multipart.Part取得multipart.File而不儲存到磁碟?

如何在Go中從multipart.Part取得multipart.File而不儲存到磁碟?

WBOY
WBOY轉載
2024-02-08 22:03:09632瀏覽

如何在Go中從multipart.Part取得multipart.File而不儲存到磁碟?

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除