I have a multipart.File
that a user uploads to my server, and then I take that file and upload it to s3 using aws-sdk-go
, but I also want to create a thumbnail of that image.
The code below works fine in my tests when I file
is the return value of an os.Open(...
of a local file, but it hit's the err
block when I send CreateThumbnail
the same variable I sent to s3
, which asks for an 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*/
Most of the answers I see for the problem involve adding import _ "image/jpeg"
, but that's already imported (as well as png
and gif
).
I'm fairly new to Golang, so I'm a bit lost as to what I'm doing wrong. I tried image.Decode(bufio.NewReader(imageFile))
as well, but that results in the same err
.
The call uploader.Upload
reads to the end of the file. Seek back to the beginning of the file before calling 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)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With