为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
紫衣仙女 2023-02-06 14:41:11
有谁知道我如何打开一个文件,在旅途中对其进行 gzip 压缩并使用 post 请求将其发送到服务器?我有一个文件,它是一个阅读器。此外,我还具有http.Post()可以将读取器作为第三个参数传递的功能。但是gzip.NewWriter()期待一个作家并返回一个作家。我知道我可以创建一些中间缓冲区来连接这一切,但我不想分配太多内存,因为这些文件可能非常大。有没有办法制作这个管道并将其传递给 HTTP post 请求?
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

其他答案概述了如何使用 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)


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信