Pergi - Penggunaan yang betul bagi Bahagian berbilang bahagian. Baca

王林
Lepaskan: 2024-02-09 08:18:27
ke hadapan
1068 orang telah melayarinya

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
                }
            }
        }
    }
}

Salin selepas log masuk

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)
}
Salin selepas log masuk
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,

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)
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan