Usa Cloud Storage

Puedes usar Cloud Storage para almacenar y entregar archivos tal como películas, imágenes y otros contenidos estáticos.

En este documento se describe cómo utilizar la biblioteca cliente de Google Cloud en tu app para almacenar y recuperar datos de Cloud Storage.

Antes de comenzar

  • Sigue las instrucciones en “Hello, World!” para PHP en App Engine a fin de configurar tu entorno y proyecto, y comprender cómo se estructuran las apps de PHP en App Engine. Anota y guarda el ID del proyecto porque lo necesitarás para ejecutar la aplicación de muestra que se describe en este documento.

  • Asegúrate de crear un bucket de Cloud Storage para tu aplicación con este comando:

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Haz que el bucket pueda leerse públicamente para que pueda entregar archivos:

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

Descarga la muestra

Para clonar el repositorio:

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

Instala dependencias y edita la configuración del proyecto

En app.yaml, establece CLOUD_STORAGE_BUCKET; este valor es el nombre del bucket de Cloud Storage que creaste antes.

env_variables:
  GOOGLE_STORAGE_BUCKET: "your-bucket-name"

En composer.json, ten en cuenta que debes incluir la biblioteca cliente de Cloud, ya que proporciona funciones de Cloud Storage.

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

Código de la aplicación

La aplicación de muestra presenta una página web en la que se solicita al usuario que proporcione un archivo para almacenarlo en Cloud Storage. Cuando el usuario selecciona un archivo y hace clic en Enviar, el controlador de carga sube el contenido del archivo en un BLOB y lo escribe en Cloud Storage.

Recuerda que, después de subir el archivo a Cloud Storage, se muestra la URL pública del archivo y podrás utilizarla para entregarlo directamente desde Cloud Storage. Debes guardar este valor en la app para usarlo más adelante.

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 obtener más información

Para obtener más información sobre Cloud Storage, consulta la documentación de Cloud Storage.