base64编码io.Reader

时间:2018-03-06 15:58:18

标签: amazon-web-services go base64

有没有办法获取包含二进制数据的io.Reader,并将其读出base64编码。

我在encoding / base64中看到

func NewDecoder(enc *Encoding, r io.Reader) io.Reader

但是假设io.Reader数据是base64并返回一个io.Reader来将其解码为二进制。

func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser

返回一个io.Writer来将二进制编码为base64,但是我需要使用go-aws-sdk s3manage上传器,它需要一个io.Reader接口。

uploader := s3manager.NewUploaderWithClient(svc)
_, err := uploader.Upload(&s3manager.UploadInput{
   Bucket: aws.String(bucket),
  Key:    aws.String(key),
  Body:   input,
})

输入需要实现io.Reader接口

数据很大,所以我不想在进行编码之前将输入完全读入内存

2 个答案:

答案 0 :(得分:5)

管道的概念用于将读者改为作者,反之亦然。

使用io.Pipe,您可以将来源io.Reader复制到编码器中,并将io.PipeReader作为要上传的正文传递。

如果您想通过它,错误处理有点不寻常,但可以使用CloseWithError方法。确保您还记下关闭管道和编码器的正确顺序。

source := strings.NewReader("Hello, World!")

pr, pw := io.Pipe()
encoder := base64.NewEncoder(base64.StdEncoding, pw)

go func() {
    _, err := io.Copy(encoder, source)
    encoder.Close()

    if err != nil {
        pw.CloseWithError(err)
    } else {
        pw.Close()
    }
}()

https://play.golang.org/p/qvc1f7kyTeP

答案 1 :(得分:0)

通道是线程安全的,但管道,多块等不是。延长管道是一个好习惯。不幸的是,base64软件包不提供“ EncoderReader”。我写了类似的东西。在那里: https://github.com/goatcms/goatcore/blob/master/goatmail/smtpmail/base64.go

一个简单的使用示例:

printer.set(align='center')
    #printer.qr("You can readme from your smartphone")
    printer.image("index/index_statics/img/brand/Webp.net-resizeimage.png")