我使用 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


}

如果有人有其他方法,请告诉我。