我正在编写一个长期运行的任务,可以从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
答案 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 {}