Base64编码io.Reader

5

有没有一种方法可以将包含二进制数据的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

这里有一个返回用于将二进制编码为base64的io.Writer函数,但我需要使用go-aws-sdk s3manage Uploader,它需要一个io.Reader接口。

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

输入需要实现 io.Reader 接口

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


你可能可以通过在 base64.Encoding 上包装一个 Transformer 接口并调用 NewReader 来实现你想要的功能... 但我自己没有尝试过,所以不确定它是否可行。 - mkopriva
2
看起来你正在寻找 https://golang.org/pkg/io/#Pipe? - Volker
1个回答

11

使用管道的概念可以将读取器转换为写入器,反之亦然。

通过使用 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接