この情報は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 {
- ...
- }
- ...
- }
- 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
参考
- https://github.com/golang/oauth2/#app-engine
- http://blog.a-know.me/entry/2015/04/19/005444
- https://cloud.google.com/appengine/docs/go/googlecloudstorageclient/getstarted
0 件のコメント:
コメントを投稿