golang-img-s3upload.md


# はじめに

サーバーで画像を圧縮して、そのデータをos.Createでファイルを作成してJPEGエンコードし、S3に画像をアップロードしようとしたら0バイトでアップロードされていた。

# Go S3uploader

エラーハンドリングは省く。

以下はS3アップロードのコード。UploadInput{}のBody((io.Reader)にデータを詰め込むだけ

  var filename string
  var buf io.Reader

        creds := credentials.NewStaticCredentials(key, secretKey, "")
        sess, _ := session.NewSession(&aws.Config{
                Credentials: creds,
                Region:      aws.String("ap-northeast-1")},
        )

        uploader := s3manager.NewUploader(sess)
        _, _ = uploader.Upload(&s3manager.UploadInput{
                Bucket:             aws.String(bucket),
                Key:                aws.String(filename),
                ACL:                aws.String("public-read"),
                ContentDisposition: aws.String("attachment"),
                Body:               buf,
        })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# fileを作成して、それをJPEGエンコードしたが、、

        out, err := os.Create("out.jpg")
        defer os.Remove(out.Name())
        if err != nil {
                return nil, err
        }
        err = jpeg.Encode(out, m, nil)
        if err != nil {
                return nil, err
        }
1
2
3
4
5
6
7
8
9

上記のBodyoutを渡したところ、空のデータとして送信されていた

# 解決

        buf := new(bytes.Buffer)
        err = jpeg.Encode(buf, m, nil)
        if err != nil {
                return err
        }
1
2
3
4
5

このようにbufを定義してエンコードして渡すとうまく行った