Cloud Storage の使用

Cloud Storage は、ファイル(動画や画像、その他の静的コンテンツなど)を保存または提供する目的で使用できます。

このドキュメントでは、アプリで Google Cloud クライアント ライブラリを使用して、Cloud Storage にデータを格納したり、Cloud Storage からデータを取得したりする方法を説明します。

始める前に

  • App Engine の Go 用「Hello, World!」の説明に従って環境とプロジェクトを設定し、App Engine での Go アプリの構造を理解してください。プロジェクト ID はこのドキュメントで説明されているサンプル アプリケーションを実行するために必要なので、メモして保存します。

  • 必ず、次のコマンドを呼び出して、アプリケーション用の Cloud Storage バケットを作成してください。

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • バケットを一般公開(読み取り可能)にして、ファイルを提供できるようにします。

    gsutil defacl set public-read gs://[YOUR_BUCKET_NAME]
    

サンプルのダウンロード

レポジトリのクローンを作成するには:

go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/storage
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/storage

プロジェクト構成の編集と依存関係のインストール

app.yamlGCLOUD_STORAGE_BUCKET を設定します。この値は、前のステップで作成した Cloud Storage バケットの名前です。

runtime: go
env: flex

automatic_scaling:
  min_num_instances: 1

env_variables:
  GCLOUD_STORAGE_BUCKET: your-bucket-name

アプリケーション コード

このサンプル アプリケーションは、Cloud Storage に保存するファイルを指定するようユーザーに促すウェブページを表示します。ユーザーがファイルを選択して [送信] をクリックすると、アップロード ハンドラが Cloud Storage の NewWriter 関数を使用して、ファイルを Cloud Storage バケットに書き込みます。

このファイルを Cloud Storage から取得するには、バケット名とファイル名を指定する必要があるので注意してください。将来の使用に備えて、これらの値をアプリに保存しておく必要があります。

// Copyright 2015 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

// Sample storage demonstrates use of the cloud.google.com/go/storage package from App Engine flexible environment.
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
	"os"

	"cloud.google.com/go/storage"

	"google.golang.org/appengine"

	"golang.org/x/net/context"
)

var (
	storageClient *storage.Client

	// Set this in app.yaml when running in production.
	bucket = os.Getenv("GCLOUD_STORAGE_BUCKET")
)

func main() {
	ctx := context.Background()

	var err error
	storageClient, err = storage.NewClient(ctx)
	if err != nil {
		log.Fatal(err)
	}

	http.HandleFunc("/", formHandler)
	http.HandleFunc("/upload", uploadHandler)

	appengine.Main()
}

func uploadHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != "POST" {
		http.Error(w, "", http.StatusMethodNotAllowed)
		return
	}

	ctx := appengine.NewContext(r)

	f, fh, err := r.FormFile("file")
	if err != nil {
		msg := fmt.Sprintf("Could not get file: %v", err)
		http.Error(w, msg, http.StatusBadRequest)
		return
	}
	defer f.Close()

	sw := storageClient.Bucket(bucket).Object(fh.Filename).NewWriter(ctx)
	if _, err := io.Copy(sw, f); err != nil {
		msg := fmt.Sprintf("Could not write file: %v", err)
		http.Error(w, msg, http.StatusInternalServerError)
		return
	}

	if err := sw.Close(); err != nil {
		msg := fmt.Sprintf("Could not put file: %v", err)
		http.Error(w, msg, http.StatusInternalServerError)
		return
	}

	u, _ := url.Parse("/" + bucket + "/" + sw.Attrs().Name)

	fmt.Fprintf(w, "Successful! URL: https://storage.googleapis.com%s", u.EscapedPath())
}

func formHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, formHTML)
}

const formHTML = `<!DOCTYPE html>
<html>
  <head>
    <title>Storage</title>
    <meta charset="utf-8">
  </head>
  <body>
    <form method="POST" action="/upload" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit">
    </form>
  </body>
</html>`

詳細情報

Cloud Storage の詳細については、Cloud Storage のドキュメントをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Go の App Engine フレキシブル環境