Cloud Storage の使用

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

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

始める前に

  • App Engine の PHP 用「Hello, World!」の手順に沿って環境とプロジェクトを設定し、App Engine での PHP アプリの構造を理解してください。このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID を書き留めておきます。

  • 次のコマンドを呼び出して、アプリケーション用の Cloud Storage バケットを作成します。

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

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

サンプルのダウンロード

リポジトリのクローンを作成するには、次のコマンドを実行します。

git clone https://github.com/GoogleCloudPlatform/php-docs-samples
cd php-docs-samples/appengine/flexible/storage

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

app.yamlCLOUD_STORAGE_BUCKET を設定します。この値は、以前に作成した Cloud Storage バケットの名前です。

env_variables:
  GOOGLE_STORAGE_BUCKET: "your-bucket-name"

composer.json では、Cloud クライアント ライブラリを追加する必要があります。これにより、Cloud Storage の関数が提供されるためです。

{
    "require": {
        "slim/slim": "^4.0",
        "slim/psr7": "^1.3",
        "google/cloud-storage": "^1.0",
        "php-di/slim-bridge": "^3.1"
    }
}

アプリケーション コード

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

ファイルが Cloud Storage にアップロードされると、このファイルの公開 URL が返されます。この URL を使用して、Cloud Storage から直接ファイルを配信できます。今後も使用できるように、この値をアプリで保存してください。

use DI\Container;
use Google\Cloud\Storage\StorageClient;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Factory\AppFactory;

// Create App
AppFactory::setContainer($container = new Container());
$app = AppFactory::create();

// Display errors
$app->addErrorMiddleware(true, true, true);

$container = $app->getContainer();

$app->get('/', function (Request $request, Response $response) use ($container) {
    /** @var Google\Cloud\StorageClient */
    $storage = $container->get('storage');
    $bucketName = $container->get('bucket_name');
    $objectName = $container->get('object_name');
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $content = $object->exists() ? $object->downloadAsString() : '';
    $escapedContent = htmlspecialchars($content);
    $response->getBody()->write(<<<EOF
    <h1>Storage Example</h1>
    <h3>Write [<a href="https://cloud.google.com/appengine/docs/flexible/php/using-cloud-storage">docs</a>]:</h3>
    <form action="/write" method="post">
        Some file content:<br />
        <textarea name="content"></textarea><br />
        <input type="submit" />
    </form>
EOF
    );
    if ($content) {
        $response->getBody()->write(
            "<p><strong>Your content:</strong><p><p>$escapedContent</p>"
        );
    }
    return $response;
});

/**
 * Write to a Storage bucket.
 * @see https://cloud.google.com/appengine/docs/flexible/php/using-cloud-storage
 */
$app->post('/write', function (Request $request, Response $response) use ($container) {
    /** @var Google\Cloud\StorageClient */
    $storage = $container->get('storage');
    $bucketName = $container->get('bucket_name');
    $objectName = $container->get('object_name');
    parse_str((string) $request->getBody(), $postData);
    $metadata = ['contentType' => 'text/plain'];
    $storage->bucket($bucketName)->upload($postData['content'] ?? '', [
        'name' => $objectName,
        'metadata' => $metadata,
    ]);
    return $response
        ->withStatus(302)
        ->withHeader('Location', '/');
});

$container->set('storage', function () use ($container) {
    $projectId = $container->get('project_id');
    $storage = new StorageClient([
        'projectId' => $projectId
    ]);
    return $storage;
});

詳細情報

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