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

我正在编写一个长时间运行的任务,该任务从 mongodb(使用 mgo)多次获取。然后使用此模块将其写入 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


慕田峪4524236
浏览 199回答 2
2回答

素胚勾勒不出你

你想使用io.Pipe。你可以做:reader, writer := io.Pipe()errChan := make(chan error)go func() {&nbsp; &nbsp; errChan <- myFTP.Stor(path, reader)}()err := myXLS.Write(writer)// handle errerr = <-errChan// handle err您可能希望writer.CloseWithError(err)ifxlsx.Write在不关闭编写器的情况下返回错误。

偶然的你

你可以使用bytes.Buffer:func uploadFileToQiniu(file *xlsx.File) (key string, err error) {&nbsp; &nbsp; key = fmt.Sprintf("%s.xlsx", util.SerialNumber())&nbsp; &nbsp; log.Debugf("file key is %s", key)&nbsp; &nbsp; log.Debug("start to write file to a writer")&nbsp; &nbsp; buf := new(bytes.Buffer)&nbsp; &nbsp; err = file.Write(buf)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Errorf("error caught when writing file: %v", err)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; size := int64(buf.Len())&nbsp; &nbsp; log.Debugf("file size is %d", size)&nbsp; &nbsp; err = Put(key, size, buf)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Errorf("error caught when uploading file: %v", err)&nbsp; &nbsp; }&nbsp; &nbsp; return key, nil}func Put(key string, size int64, reader io.Reader) error {}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go