GAEアプリにファイルをアップロードしようとしています。Goとを使用してGoogleAppEngineにファイルをアップロードするにはどうすればよいr.FormValue()
ですか?
4 に答える
アイデアを得るには、Blobstore Go API の概要を確認する必要があります。Go を使用して Google App Engine でユーザー データを保存および提供する方法の完全な例があります。
その例を完全に別のアプリケーションで実行することをお勧めします。そうすれば、既存のアプリケーションに統合する前に、しばらく試してみることができます。
中間の戻り値パラメーター「その他」を使用して、問題を解決することができました。以下のこれらのコードは、アップロード ハンドラ内にあります。
blobs, other, err := blobstore.ParseUpload(r)
次に、対応するフォームキーを割り当てます
file := blobs["file"]
**name := other["name"]** //name is a form field
**description := other["description"]** //descriptionis a form field
そして、構造体の値の割り当てでこのように使用します
newData := data{
Name: **string(name[0])**,
Description: **string(description[0])**,
Image: string(file[0].BlobKey),
}
datastore.Put(c, datastore.NewIncompleteKey(c, "data", nil), &newData )
これが正しいことであると 100% 確信しているわけではありませんが、これで問題が解決し、画像が blobstore にアップロードされ、他のデータと blobkey がデータストアに保存されます。
これが他の人にも役立つことを願っています。
Blobstore API を使用するだけでなく、Request.FormFile()
メソッドを使用してファイル アップロード コンテンツを取得することもできます。追加のヘルプについては、net\httpパッケージのドキュメントを使用してください。
blobstore.UploadUrl()
Request を直接使用すると、アップロード POST メッセージを処理する前に設定をスキップできます。
簡単な例は次のとおりです。
func uploadHandler(w http.ResponseWriter, r *http.Request) {
// Create an App Engine context.
c := appengine.NewContext(r)
// use FormFile()
f, _, err := r.FormFile("file")
if err != nil {
c.Errorf("FormFile error: %v", err)
return
}
defer f.Close()
// do something with the file here
c.Infof("Hey!!! got a file: %v", f)
}
ここから完全な例を試してみましたhttps://developers.google.com/appengine/docs/go/blobstore/overview、ブロブストアにアップロードして提供するとうまくいきました。
しかし、データストアのどこかに保存する追加の投稿値を挿入すると、「r.FormValue()」の値が消去されますか? 以下のコードを参照してください
func handleUpload(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
//tried to put the saving in the datastore here, it saves as expected with correct values but would raised a server error.
blobs, _, err := blobstore.ParseUpload(r)
if err != nil {
serveError(c, w, err)
return
}
file := blobs["file"]
if len(file) == 0 {
c.Errorf("no file uploaded")
http.Redirect(w, r, "/", http.StatusFound)
return
}
// a new row is inserted but no values in column name and description
newData:= data{
Name: r.FormValue("name"), //this is always blank
Description: r.FormValue("description"), //this is always blank
}
datastore.Put(c, datastore.NewIncompleteKey(c, "Data", nil), &newData)
//the image is displayed as expected
http.Redirect(w, r, "/serve/?blobKey="+string(file[0].BlobKey), http.StatusFound)
}
アップロードを通常のデータと組み合わせることはできませんか? r.FormValue() の値がファイル (入力ファイルの種類) を除いて消えているように見えるのはなぜですか? アップロードの結果として、ブロブキーを他のデータに関連付ける前に最初にアップロードを強制する必要がある場合でも、r.FormValue() をアップロード ハンドラーに渡すことができなかったので、それは不可能です (これは私が言ったように)空になるか、blobs, _, err := blobstore.ParseUpload(r) ステートメント) の前にアクセスするとエラーが発生します。誰かがこの問題を解決するのを手伝ってくれることを願っています。ありがとうございました!