如何在没有内存分配的情况下压缩和发布文件

有谁知道我如何打开一个文件,在旅途中对其进行 gzip 压缩并使用 post 请求将其发送到服务器?

我有一个文件,它是一个阅读器。此外,我还具有http.Post()可以将读取器作为第三个参数传递的功能。但是gzip.NewWriter()期待一个作家并返回一个作家。

我知道我可以创建一些中间缓冲区来连接这一切,但我不想分配太多内存,因为这些文件可能非常大。有没有办法制作这个管道并将其传递给 HTTP post 请求?


紫衣仙女
浏览 77回答 1
1回答

慕运维8079593

其他答案概述了如何使用 io.Pipe。这个答案显示了更多细节,特别是关于错误处理。func gzFileReader(fname string) (io.ReadCloser, error) {    f, err := os.Open(fname)    if err != nil {        return nil, err    }    // Use io.Pipe and a goroutine to create reader    // on data written by the appliation.    r, w := io.Pipe()    go func() {        // Always close the file.        defer f.Close()        // Copy file through gzip to pipe writer.        gzw := gzip.NewWriter(w)        _, err := io.Copy(gzw, f)        // Use CloseWithError to propgate errors back to        // the main goroutine.        if err != nil {            w.CloseWithError(err)            return        }        // Flush the gzip writer.        w.CloseWithError(gzw.Close())    }()    return r, nil}使用这样的功能:body, err := gzFileReader("example.txt")if err != nil {    log.Fatal(err)}defer body.Close()req, err := http.NewRequest("POST", "http://example.com/", body)if err != nil {    log.Fatal(err)}req.Header.Set("Content-Encoding", "gzip")resp, err := http.DefaultClient.Do(req)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go