有人知道如何使用POST请求打开文件、对其进行压缩并将其发送到服务器吗?
我有一份文件是阅读器.另外,我有http.Post()
个函数,可以将读取器作为第三个参数传递.
但gzip.NewWriter()
期待的是一个作家,而返回的却是一个作家.
我知道我可以创建一些中间缓冲区来连接这一切,但我不想分配太多内存,因为这些文件可能非常大. 有没有办法生成这个管道并将其传递给HTTP POST请求?
有人知道如何使用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)