GAE/GOからGCSに画像アップロードして公開する


アップロード


func upload(ctx context.Context, body []byte, storagePath string) (urlString string, err error) {
    bucketname, err := file.DefaultBucketName(ctx)
    if err != nil { return }

    client, err := storage.NewClient(ctx)
    if err != nil { return }

    writer := client.Bucket(bucketname).Object(storagePath).NewWriter(ctx)
    writer.ContentType = "image/jpeg"
    defer writer.Close()
    _, err = writer.Write(body)
    if err != nil {
        return
    }
    urlString = "https://storage.googleapis.com/" + bucketname + "/" + storagePath
    return
}

bodyはioutil.ReadAllとかで取り出したbyte列
storagePathは"images/128082/1233.jpg"とか、/から始めないこと

権限変更

このままだとアップロードしても

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied.</Message>
  <Details>
    Anonymous users does not have storage.objects.get access to object file.
  </Details>
</Error>

と言われるので、権限を変更する。
権限はバケット毎に変更する。ディレクトリ自体単位では変更出来ない。

https://console.cloud.google.com/storage/browser?project=#{project id}

からバケットを選んで、左側の・・・からオブジェクトのデフォルトの権限を編集

ユーザー:allUsers:読み取り
と設定する。最初allUsersをどうやって指定するのかわからなかったけど普通にallUsersって入れておけばOK