有没有办法获取包含二进制数据的 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 接口(interface)。
uploader := s3manager.NewUploaderWithClient(svc)
_, err := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: input,
})
input需要实现io.Reader接口(interface)
数据很大,所以不想在编码前把输入全部读入内存
最佳答案
管道的概念用于将读取器更改为写入器,反之亦然。
使用 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()
}
}()
关于amazon-web-services - base64 编码 io.Reader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135097/