有人知道如何使用POST请求打开文件、对其进行压缩并将其发送到服务器吗?

我有一份文件是阅读器.另外,我有http.Post()个函数,可以将读取器作为第三个参数传递. 但gzip.NewWriter()期待的是一个作家,而返回的却是一个作家.

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

推荐答案

其他答案概述了如何使用io.piet.这个答案显示了更多细节,特别是关于错误处理.

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)

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

使用恶意软件 scanner (ClamAV)时的Google云存储桶上传文件验证

Golang测试容器,无法使网络正常工作

如何在GoFr中为生产和本地环境设置不同的配置?

如何将文件从AWS S3存储桶复制到Azure BLOB存储

一次打印用户输入的字符串n次

加载 docker 镜像失败

如何使用 go-git 将特定分支推送到远程

如何使用 GolangCI 删除未使用的导入

Go:如何在将 float64 转换为 float32 时判断精度损失

如何在 Golang http.Request 对象中读取自定义 ajaxParams

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

如何在时间范围内规范化数组的元素?

如何在 helm 中将字符串连接到 .AsConfig 的结果?

go 是否对 struct 使用空间填充之类的东西?

如何在 GORM 中获取字段值

带有 grpc 的 protobuf 用于拆分包中的 Go

从 map 返回空数组而不是空字符串数组

map和struct golang的合并

有没有办法停止long blocking 函数?