Google App Engine の Images API とは何か(+Go のサンプル実装)
Images API とは?
Cloud Storage に保管された画像に対して、パラメータによる動的なリサイズや切り抜きを行える公開 URL を発行してくれるものです。
自前で画像のリサイズ処理を書かなくても、簡単にサムネイル用の画像などが配信できて非常に便利です。
Serving URL 画像処理パラメータ
URLの末尾に =s32
のような文字列をつけることで、動的に処理された画像を取得できます。
処理 | パラメータ例 |
---|---|
幅32px に収まるようにリサイズ | http://lh*.googleusercontent.com/xxxxxxx=s32 |
32x32px の正方形にリサイズ + 切り抜き | http://lh*.googleusercontent.com/xxxxxxx=s32-c |
Go で実装してみる
Cloud Storage に保存されているファイルの Serving URL を生成する最小限の Google App Engine 実装を Go で書いてみました。
package main
import (
"context"
"fmt"
"google.golang.org/appengine"
"google.golang.org/appengine/blobstore"
"google.golang.org/appengine/image"
"net/http"
)
func init() {
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
ctx := appengine.NewContext(r)
// Cloud Storage のファイルの情報を次の2変数に入れる
cloudStorageBucketID := "<BucketID>"
cloudStorageObjectID := "<ObjectID>"
servingURL, err := generateServingUrl(ctx, cloudStorageBucketID, cloudStorageObjectID)
if err != nil {
fmt.Fprintf(w, "[error!] %s", err)
return
}
fmt.Fprintf(w, "Serving URL: %s", servingURL)
}
// Serving URL を生成する
func generateServingUrl(ctx context.Context, bucketID, objectID string) (string, error) {
// Cloud Storage にあるファイルの指定方法は /gs/<bucketID>/<objectID> で決まっています
// https://cloud.google.com/appengine/docs/standard/go/blobstore/reference#BlobKeyForFile
gsURL := fmt.Sprintf("/gs/%s/%s", bucketID, objectID)
// Cloud Storage の指定から Serving URL 生成に渡すためには blobstore key 形式で渡す必要があります
// https://cloud.google.com/appengine/docs/standard/go/images/#serving_images_from_cloud_storage_using_the_blobstore_api
blobKey, err := blobstore.BlobKeyForFile(ctx, gsURL)
if err != nil {
return "", err
}
// Serving URL を生成
servingURLOpts := &image.ServingURLOptions{Secure: true}
url, err := image.ServingURL(ctx, blobKey, servingURLOpts)
if err != nil {
return "", err
}
return url.String(), nil
}
このコードを App Engine にデプロイ後、アクセスすると Serving URL がブラウザに出力されます。
末尾に =s200
のようにパラメータをつけて、リサイズされるか試してみましょう!
注意点
Images API が使えるのは App Engine 上のみ
Cloud Storage API から直接できそうな気もしたのですが、Images API は AppEngine の APIであり、Cloud Storage API ではない ので無理でした。
Cloud Storage 側にも Images API 相当の機能を提供してほしいという意見はあるみたいです。今後に期待!
- Provide image serving+resizing outside of standard environment - Google Issue Tracker
- Get Serving URL for images stored in Storage (Similar to App Engine Image Class) · Issue #1295 · GoogleCloudPlatform/google-cloud-python
Serving URL は誰でもアクセスできる
生成される URL はランダム文字列がついているので、推測は難しいですが、URL自体は誰でもアクセスできる状態になっています。
生成元の cloud storage オブジェクトが非公開であっても、Serving URL の画像は常に公開状態となります。
ローカル開発サーバーでは正常な Serving URL が生成できない
goapp serve
などのローカル開発サーバーを使うと、正常な Serving URL は生成されず次のような仮のURLとなります。
http://localhost:8080/_ah/img/encoded_gs_file:PEJ1Y2tldElEPi88T2JqZWN0SUQ-
参考サイト
Author And Source
この問題について(Google App Engine の Images API とは何か(+Go のサンプル実装)), 我々は、より多くの情報をここで見つけました https://qiita.com/castaneai/items/fa882033a5d03aded102著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .