为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪4524236 2021-10-18 17:03:18
我正在编写一个长时间运行的任务,该任务从 mongodb(使用 mgo)多次获取。然后使用此模块将其写入 xlsx 文件。然后使用再次阅读,os.Open然后将其存储到我的 ftp 服务器。Stor函数消耗了我这么多内存,所以我认为应该有一种方法不保存文件,而是将我的数据从 xlsx.Write 直接传递到 ftp.Store。(如果我可以同时流式传输将是完美的,因为在将它们发送到 Stor 功能之前我不必将所有文档保存在服务器的内存中)这些是函数的原型func (f *File) Write(writer io.Writer) (err error) xlslfunc (ftp *FTP) Stor(path string, r io.Reader) (err error) FTP
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

你想使用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)ifxlsx.Write在不关闭编写器的情况下返回错误。


查看完整回答
反对 回复 2021-10-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

你可以使用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 {}


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信