Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi - Penggunaan yang betul bagi Bahagian berbilang bahagian. Baca

Pergi - Penggunaan yang betul bagi Bahagian berbilang bahagian. Baca

王林
王林ke hadapan
2024-02-09 08:18:271070semak imbas

Go - 多部分 Part.Read 的正确用法

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!

Kandungan soalan

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?

Penyelesaian

Anda menggunakan multipart.part dengan cara yang betul.

. pembaca

Dipetik 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 muka

io.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)
}
Jika anda perlu menggunakan penimbal, anda boleh menggunakan fungsi io.copybuffer(). Walau bagaimanapun, ambil perhatian bahawa anda perlu menyembunyikan pelaksanaan io.readerfrom, jika tidak penimbal tidak akan menggunakan untuk melaksanakan salinan. Lihat contoh: 1 p>,

2, 3.

_, 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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam