base64编码io.Reader

AC.*_*AC. 3 base64 go amazon-web-services

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

我在编码/ base64中看到了

func NewDecoder(enc *Encoding, r io.Reader) io.Reader
Run Code Online (Sandbox Code Playgroud)

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

func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser
Run Code Online (Sandbox Code Playgroud)

返回一个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,
})
Run Code Online (Sandbox Code Playgroud)

输入需要实现io.Reader接口

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

Jim*_*imB 6

Pipe的概念用于将读者更改为Writers,反之亦然.

使用a 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()
    }
}()
Run Code Online (Sandbox Code Playgroud)

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