Semasa proses pembangunan bahasa Go, editor Apple Apple sering menghadapi keperluan untuk mendapatkan berbilang bahagian. Fail daripada objek berbilang bahagian. Bahagian apabila menggunakan pakej berbilang bahagian untuk memproses fail muat naik borang. Walau bagaimanapun, pakej berbilang bahagian dalam pustaka standard tidak secara langsung menyediakan kaedah untuk mendapatkan berbilang bahagian. Fail, tetapi menyimpan fail ke cakera secara lalai. Jadi, adakah terdapat cara untuk memintas pengehadan ini dan mendapatkan multipart.Fail terus dari multipart.Part? Seterusnya, kami akan memperkenalkan anda kepada kaedah untuk mendapatkan multipart.Fail daripada multipart.Part dalam Go tanpa menyimpannya ke cakera.
Dalam API saya, saya mempunyai fungsi yang berfungsi dengan baik dengan menghantar dari r.Body
中提取 multipart.File
seperti yang ditunjukkan di bawah
file, handler, err := r.FormFile("file")
Saya menggunakan multipart.File
untuk memuat naik ke s3 API menggunakan klien minio seperti yang ditunjukkan di bawah
err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)
Sekarang saya telah menambah data borang tambahan, saya nampaknya tidak boleh menggunakan r.Body untuk mencapai ini lagi. Saya mendapat mesej "Ralat mengambil fail borang" seperti yang ditunjukkan dalam kod di bawah.
Berdasarkan soalan ini, saya melaksanakan MultipartReader
untuk mendapatkan data borang daripada multipart.Part.
tidak mempunyai multipart.File
jadi saya perlu melaksanakan bahagian itu tanpa menulisnya ke cakera dan membacanya semula jika boleh.
Ini kod saya
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 }
Anda sudah menstrim bahagian borang, anda tidak boleh menghubungi FormFile
,您必须自己读取该文件。使用 part.Read
读取文件的字节,或者复制文件等。请注意,part
实现了 io.Reader
sekarang supaya anda boleh membaca daripadanya seperti fail.
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan multipart.File daripada multipart.Part dalam Go tanpa menyimpan ke cakera?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!