有没有办法获取包含二进制数据的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接口
数据很大,所以我不想在进行编码之前将输入完全读入内存
答案 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()
}
}()
答案 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")