2015年9月9日水曜日

Google App Engine / Go で Google Cloud Storage に画像をアップロードする

How to upload image to Google Cloud Storage with Google App Engine / Go.

この情報は2015年9月9日時点のものです。appengine.Context, context.Context 問題は過渡期のようなので今後インタフェースが変わる可能性があります。

File API が終了になったので調べたけどあんまり情報がなく苦労したのでメモとして残しておく

storage#NewWriter に渡す Context は appengine#Context ではなく context#Context なので次のようにするとエラーになります。

import ( "appengine" "google.golang.org/cloud/storage" ... ) func uploadImage(w http.ResponseWriter, r *http.Request) { ... c := appengine.NewContext(r) wc := storage.NewWriter(c, bucketName, fileName) wc.ContentType = "image/jpg" if _, err := wc.Write(data); err != nil { ... } ... } google.golang.org/appengine の NewContext は context#Context を返すため、こちらを利用します。このワークアラウンドは https://github.com/golang/oauth2/#app-engine を参考にしています。 import ( "appengine" "fmt" "io/ioutil" "net/http" "strings" "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/google" newappengine "google.golang.org/appengine" newurlfetch "google.golang.org/appengine/urlfetch" "google.golang.org/cloud" "google.golang.org/cloud/storage" ) func uploadImage(w http.ResponseWriter, r *http.Request) { file, fileHeader, err := r.FormFile("image_file") if err != nil { fmt.Fprint(w, "no image") // no image return } defer file.Close() data, err := ioutil.ReadAll(file) if err != nil { fmt.Fprint(w, "cloud not upload image") return } var mimeType string if strings.HasSuffix(filename, ".png") { mimeType = "image/png" } else if strings.HasSuffix(filename, ".jpeg") { mimeType = "image/jpg" } else { mimeType = "image/jpg" } bucketName := "mybucketname" fileName := fileHeader.Filename c := appengine.NewContext(r) ctx := newappengine.NewContext(r) hc := &http.Client{ Transport: &oauth2.Transport{ Source: google.AppEngineTokenSource(ctx, storage.ScopeFullControl), Base: &newurlfetch.Transport{Context: ctx}, }, } ctx2 := cloud.NewContext(appengine.AppID(c), hc) wc := storage.NewWriter(ctx2, bucketName, fileName) wc.ContentType = mimeType if _, err := wc.Write(data); err != nil { fmt.Fprint(w, "cloud not upload image") return } if err := wc.Close(); err != nil { return }
google.golang.org/cloud/storage などは GOPAH を設定して $ go get -u google.golang.org/cloud/storage でインストールしておきます


参考


0 件のコメント:

コメントを投稿