亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 io.Pipe() 讀/寫 golang 下載一個 zip 文件

使用 io.Pipe() 讀/寫 golang 下載一個 zip 文件

Go
郎朗坤 2022-04-20 17:39:36
我正在嘗試使用 golang 中的 io.Pipe() 函數流式傳輸 zip 文件的字節。我正在使用管道閱讀器讀取 zip 中每個文件的字節,然后將它們流式傳輸并使用管道編寫器將字節寫入響應對象中。func main() {  r, w := io.Pipe() // go routine to make the write/read non-blocking  go func() {    defer w.Close()    bytes, err := ReadBytesforEachFileFromTheZip()     err := json.NewEncoder(w).Encode(bytes)    handleErr(err)  }()這不是一個有效的實現,而是我想要實現的結構。我不想使用 ioutil.ReadAll 因為文件會非常大,并且 Pipe() 將幫助我避免將所有數據放入內存。有人可以幫助使用 io.Pipe() 實現工作嗎?
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

我使用 golang io.Pipe() 使它工作。 Pipewriter 將字節以塊的形式寫入管道,而 pipeReader 讀取器則從另一端寫入。使用 go-routine 的原因是有一個非阻塞的寫操作,而同時讀取從管道發生。


注意:關閉管道寫入器 (w.Close()) 以在流上發送 EOF 很重要,否則它不會關閉流。


func DownloadZip() ([]byte, error) {

    r, w := io.Pipe()


    defer r.Close()

    defer w.Close()


    zip, err := os.Stat("temp.zip")

    if err != nil{

        return nil, err

    }


    go func(){


        f, err := os.Open(zip.Name())

        if err != nil {

            return


        }


        buf := make([]byte, 1024)

        for {

            chunk, err := f.Read(buf)

            if err != nil && err != io.EOF {

                panic(err)

            }

            if chunk == 0 {

                break

            }


            if _, err := w.Write(buf[:chunk]); err != nil{

                return

            }


        }


        w.Close()

    }()


    body, err := ioutil.ReadAll(r)

    if err != nil {

        return nil, err

    }

    return body, nil


}

如果有人有其他方法,請告訴我。



查看完整回答
反對 回復 2022-04-20
  • 1 回答
  • 0 關注
  • 313 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號