如何连接io.Reader和io.Writer?

时间:2015-07-07 04:35:59

标签: go io

我正在编写一个长期运行的任务,可以从mongodb(使用mgo)多次获取。然后使用this module将其写入xlsx文件。然后使用os.Open再次读取它,然后将其存储到我的ftp服务器。

Stor函数消耗了我的内存,所以我认为应该有一种方法不保存文件,而是直接将我的数据从xlsx.Write传递给ftp.Store。 (如果我可以同时进行流式传输将是完美的,因为在将它们发送到Stor函数之前我不必将所有文档都保存在服务器的内存中)

这些是函数的原型

func (f *File) Write(writer io.Writer) (err error) xlsl

func (ftp *FTP) Stor(path string, r io.Reader) (err error) ftp

2 个答案:

答案 0 :(得分:8)

您想使用io.Pipe。你可以这样做:

reader, writer := io.Pipe()
errChan := make(chan error)
go func() {
    errChan <- myFTP.Stor(path, reader)
}()
err := myXLS.Write(writer)
// handle err
err = <-errChan
// handle err

如果writer.CloseWithError(err)在没有关闭作者的情况下返回错误,您可能希望xlsx.Write

答案 1 :(得分:0)

您可以使用bytes.Buffer

func uploadFileToQiniu(file *xlsx.File) (key string, err error) {
    key = fmt.Sprintf("%s.xlsx", util.SerialNumber())
    log.Debugf("file key is %s", key)

    log.Debug("start to write file to a writer")
    buf := new(bytes.Buffer)
    err = file.Write(buf)
    if err != nil {
        log.Errorf("error caught when writing file: %v", err)
        return
    }

    size := int64(buf.Len())
    log.Debugf("file size is %d", size)
    err = Put(key, size, buf)
    if err != nil {
        log.Errorf("error caught when uploading file: %v", err)
    }
    return key, nil
}
func Put(key string, size int64, reader io.Reader) error {}