この情報は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
でインストールしておきます
参考
- 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