为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 无法从 S3 读取 PNG

Golang 无法从 S3 读取 PNG

Go
万千封印 2023-03-21 15:16:19
我正在尝试从 AWS S3 读取 png 文件,它返回[]byte.但是,我无法从bytes.NewReader(). 这是我的代码config := aws.Config{    Region: aws.String(region),}sess := session.Must(session.NewSession(&config))svc := s3.New(sess)s3Output, err := svc.GetObject(&s3.GetObjectInput{    Bucket: aws.String(bucket),    Key:    aws.String(key),})if err != nil {    return make([]byte, 0), err}buf := new(bytes.Buffer)buf.ReadFrom(s3Output.Body)imgReader := bytes.NewReader(buf.Bytes())_, format, err := image.DecodeConfig(imgReader )if err != nil {    return nil, err}fmt.Println(format)img, err := png.Decode(imgReader)if err != nil {    return nil, err}格式返回png但错误png: invalid format: not a PNG file我尝试使用文件并成功file, err := os.Open(ImageFile)if err != nil {    log.Fatal(err)}// decode jpeg into image.Imageimg, err := png.Decode(file)if err != nil {    log.Fatal(err)}file.Close()我该如何解决这个问题?更新这是输出s3Output{  AcceptRanges: "bytes",  Body: buffer(0xc04220e040),  ContentLength: 102104,  ContentType: "image/png",  ETag: "\"d1b5490e26ddd6259cd5d17fa3c4dc6b\"",  LastModified: 2018-08-16 09:30:35 +0000 UTC,  Metadata: {  }}
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

尝试使用 AWS S3 下载管理器,它可以让您直接下载图像,其中包含上传到 aws s3 的图像的元数据和位置


buff := &aws.WriteAtBuffer{}

s3dl := s3manager.NewDownloader(sess)

_, err := s3dl.Download(buff, &s3.GetObjectInput{

    Bucket: aws.String(bucket),

    Key:    aws.String(key),

})


if err != nil {

    log.Printf("Could not download from S3: %v", err)

}

使用s3Output.Body将为您提供输出,因为它已经以字节为单位包含上传的文件内容。因此,您需要在将图像转换为字节后使用图像创建一个缓冲区。该函数png.Decode在 io.Reader 上的工作方式为:

func Decode(r io.Reader) (image.Image, error)

Decode 从 r 中读取 PNG 图像并将其作为 image.Image 返回。返回的图像类型取决于 PNG 内容。

检查此示例,其中 Base64 代码使用png.Decode.

AWS S3 提供了专门的下载管理器来直接从存储桶中下载文件。有关详细信息,请检查 AWS S3 基本存储桶操作


查看完整回答
反对 回复 2023-03-21
?
BIG阳

TA贡献1859条经验 获得超6个赞

事实证明,读者会改变image.DecodeConfig


所以如果我使用


imgFormat := bytes.NewReader(buf.Bytes())

imgReader := bytes.NewReader(buf.Bytes())

_, format, err := image.DecodeConfig(imgFormat)

if err != nil {

    return nil, err

}

fmt.Println(format)

img, err := png.Decode(imgReader)

if err != nil {

    return nil, err

}

fmt.Println(img)

return nil, nil

它不会抛出任何错误。我现在会坚持这样做,但如果有更好的方法,请随时发布答案。


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号