亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號