editor php Xinyi hari ini akan memperkenalkan kepada anda penggunaan yang betul bagi Bahagian berbilang bahagian. Baca dalam bahasa Go. Semasa memproses permintaan HTTP, kami sering menghadapi situasi di mana kami perlu membaca berbilang bahagian data, seperti memproses muat naik fail. Pakej net/http bahasa Go menyediakan kaedah Part.Read untuk membaca data berbilang bahagian, tetapi ramai pembangun akan menghadapi beberapa masalah apabila menggunakannya. Artikel ini akan menerangkan secara terperinci penggunaan Part.Read yang betul untuk membantu pembangun mengendalikan data berbilang bahagian dengan lebih baik dan meningkatkan kestabilan dan prestasi program. Mari lihat!
Saya telah cuba menggunakan multipart.part untuk membantu membaca daripada http untuk muat naik fail yang sangat besar (>20gb) - jadi saya menulis kod berikut dan nampaknya berfungsi dengan baik:
func ReceiveMultipartRoute(w http.ResponseWriter, r *http.Request) { mediatype, p, err := mime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { //... } if mediatype != "multipart/form-data" { //... } boundary := p["boundary"] reader := multipart.NewReader(r.Body, boundary) buffer := make([]byte, 8192) for { part, err := reader.NextPart() if err != nil { // ... } f, err := os.CreateTemp("", part.FileName()) if err != nil { // ... } for { numBytesRead, err := part.Read(buffer) // People say not to read if there's an err, but then I miss the last chunk? f.Write(buffer[:numBytesRead]) if err != nil { if err == io.EOF { break } else { // error, abort ... return } } } } }
Namun, di bahagian paling dalam untuk gelung, saya mendapati bahawa saya perlu membaca dari bahagian.baca sebelum menyemak eof kerana saya perasan bahawa jika saya melakukan ini terlebih dahulu dan patah, saya akan terlepas blok terakhir. Walau bagaimanapun, saya perhatikan dalam banyak artikel/siaran lain bahawa orang menyemak ralat/eof, dan menyemak break
-ing jika ada tanpa menggunakan bacaan terakhir. Adakah saya menggunakan multipart.part.read() dengan salah/selamat?
Anda menggunakan multipart.part dengan cara yang betul.
. pembacaDipetik daripada dokumentasi: Pemanggil hendaklah sentiasa mengendalikan n > 0 bait yang dikembalikan sebelum mempertimbangkan ralat. Ini membolehkan pengendalian yang betul bagi ralat i/o yang berlaku selepas membaca beberapa bait serta tingkah laku yang dibenarkan. Juga ambil perhatian bahawa dalam contoh anda menyalin data daripada < io.reader ke os.file. os.file
melaksanakan
antara mukaio.readerfrom, jadi anda boleh menyalin data menggunakan kaedah file.readfrom().
_, err := file.readfrom(part) // non io.eof if err != nil { return fmt.errorf("copy data: %w", err) }
_, err := io.CopyBuffer(writeFunc(file.Write), part, buffer) // non io.EOF if err != nil { return fmt.Errorf("copy data: %w", err) } type writeFunc func([]byte) (int, error) func (write writeFunc) Write(data []byte) (int, error) { return write(data) }
Atas ialah kandungan terperinci Pergi - Penggunaan yang betul bagi Bahagian berbilang bahagian. Baca. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!