代码之家  ›  专栏  ›  技术社区  ›  kkesley

Golang无法从S3读取PNG

  •  2
  • kkesley  · 技术社区  · 6 年前

    []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.Image
    img, 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 回复  |  直到 6 年前
        1
  •  1
  •   Himanshu    6 年前

    尝试使用AWS S3下载管理器,它将允许您直接下载带有元数据和awss3上上传图像位置的图像

    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上工作。读卡器为:

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

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

    this example 其中Base64代码使用 png.解码

    AWS S3提供了专门的下载管理器,可以直接从bucket中下载文件。了解更多信息 Check AWS S3 Basic bucket operations

        2
  •  0
  •   kkesley    6 年前

    我不知道为什么,但如果我用 s3Output.Body 我没有使用字节,而是得到了正确的结果。

    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),
    })
    img, err := png.Decode(s3Output.Body)
    

    你可以解释为什么会这样,我很乐意把你的答案标为正确答案:)

    结果发现读者会被修改 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
    

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