【问题标题】:image.Decode results in "unknown format" when source is multipart.File当源为 multipart.File 时,image.Decode 会导致“未知格式”
【发布时间】:2015-09-02 22:56:45
【问题描述】:

我有一个用户上传到我的服务器的multipart.File,然后我使用aws-sdk-go 将该文件上传到s3,但我还想创建该图像的缩略图。

当我file 是本地文件的os.Open(... 的返回值时,下面的代码在我的测试中运行良好,但是当我发送CreateThumbnail 时,它命中了err 块我发送到的相同变量s3,它要求io.Reader

import (
  "image"
  "image/jpeg"
)
func UploadToS3(file multipart.File, /*snip*/) {
  _, uploadErr := uploader.Upload(&s3manager.UploadInput{
    Bucket: aws.String(bucket),
    Key:    aws.String(key),
    Body:   file,
    ContentType: aws.String(mimeType),
    ACL: aws.String("public-read"),
  })
  reader, err := CreateThumbnail(file)
}    

func CreateThumbnail(imageFile io.Reader) (io.Reader, error) {
  decodedImage, _, err := image.Decode(imageFile)
  if err != nil {
   fmt.Println("Error decoding", err, decodedImage) // "unknown format"
   return nil, err
 }
 /*snip*/

我看到的大多数关于该问题的答案都涉及添加import _ "image/jpeg",但这已经导入(以及pnggif)。 我对 Golang 还很陌生,所以我对自己做错了什么有点迷茫。我也试过image.Decode(bufio.NewReader(imageFile)),但结果是相同的err

【问题讨论】:

  • 您可以通过确保 multipart.File 确实是 jpeg 来调试它:检查前几个字节。
  • @Volker 不是,前 2 个字节不是 'FF D8'。我可以将该变量发送到 s3 并将其保存为图像,如果没有image.Decode(imageFile),我如何在本地执行相同的操作?
  • 不知道。如果你可以发布让我们说前 100 个字节有人可能会认出它。

标签: image go martini


【解决方案1】:

调用uploader.Upload 读取到文件末尾。调用CreateThumbnail之前先回到文件开头:

func UploadToS3(file multipart.File, /*snip*/) {
  _, uploadErr := uploader.Upload(&s3manager.UploadInput{
    Bucket: aws.String(bucket),
    Key:    aws.String(key),
    Body:   file,
    ContentType: aws.String(mimeType),
    ACL: aws.String("public-read"),
  })
  // Seek back to beginning of file for CreateThumbnail
  if _, err := file.Seek(0, 0); err != nil {
    // handle error
  }
  reader, err := CreateThumbnail(file)
}    

【讨论】:

  • 只要我将参数类型更改为multipart.File(因为它实现了io.Readerio.Seeker),这项工作就可以了。谢谢@ThunderCat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多