Como usar o Cloud Storage

Use o Cloud Storage para armazenar e disponibilizar arquivos como filmes, imagens ou outros conteúdos estáticos.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud no seu aplicativo para armazenar e recuperar dados do Cloud Storage.

Antes de começar

  • Siga as instruções em "Hello, World!" para PHP no App Engine para configurar o ambiente e o projeto, além de compreender como aplicativos PHP são estruturados no App Engine. Anote e salve o ID do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

  • Certifique-se de criar um bucket do Cloud Storage para o aplicativo invocando o seguinte comando:

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Configure o bucket como acessível para leitura pública para disponibilização de arquivos:

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

Fazer o download da amostra

Para clonar o repositório:

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

Editar a configuração do projeto e instalar as dependências

Em app.yaml, defina CLOUD_STORAGE_BUCKET. Esse valor é o nome do bucket do Cloud Storage criado anteriormente.

env_variables:
  GOOGLE_STORAGE_BUCKET: "your-bucket-name"

Em composer.json, observe que é preciso incluir a biblioteca de cliente do Cloud, porque isso fornece as funções do Cloud Storage.

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

Código do aplicativo

O aplicativo de amostra apresenta uma página da Web que solicita ao usuário um arquivo para ser armazenado no Cloud Storage. Depois que o usuário seleciona o arquivo e clica em enviar, o gerenciador de upload carrega o conteúdo do arquivo em um blob e o salva no Cloud Storage.

Após o upload do arquivo no Cloud Storage, o URL público dele é retornado. É possível usá-lo para disponibilizar o arquivo diretamente do Cloud Storage. Armazene esse valor no app para uso futuro.

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;
});

Para saber mais

Consulte a documentação do Cloud Storage para informações completas.