【问题标题】:base64 encode io.Readerbase64 编码 io.Reader
【发布时间】:2018-03-06 15:58:17
【问题描述】:

有没有办法获取包含二进制数据的 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 Uploader,它采用 io.Reader 接口。

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

input需要实现io.Reader接口

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

【问题讨论】:

  • 您可以通过实现Transformer 接口和围绕base64.Encoding 的包装器和调用NewReader 来做您想做的事情...但我自己没有尝试过,所以我不知道是否可行。
  • 您似乎在寻找golang.org/pkg/io/#Pipe

标签: amazon-web-services go base64


【解决方案1】:

管道的概念用于将读取器更改为写入器,反之亦然。

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

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多