Como conceder acesso público aos arquivos

Um caso de uso comum é tornar seus arquivos acessíveis publicamente pela Web. É possível fazer isso no ambiente padrão do PHP 5 de uma das seguintes maneiras:

  • Exiba os arquivos no Google Cloud Storage usando um script: seu aplicativo exibe o arquivo.
  • Disponibilize os arquivos do Google Cloud Storage, que disponibiliza o arquivo diretamente.
  • Exiba arquivos enviados com seu aplicativo usando o gerenciador estático em app.yaml.

Observe que a última metodologia não usa o Cloud Storage.

Como exibir arquivos de um script

Se você quiser exibir arquivos do aplicativo, importe a classe CloudStorageTools do App Engine:

use google\appengine\api\cloud_storage\CloudStorageTools;

Agora, use o CloudStorageTools::serve para exibir o arquivo do Google Cloud Storage:

CloudStorageTools::serve("gs://${my_bucket}/serve.txt");

A disponibilização de arquivos do aplicativo dessa maneira permite que o desenvolvedor determine a identidade do usuário e garanta que apenas usuários autorizados acessem o arquivo. A desvantagem dessa abordagem é que seu aplicativo precisa executar esse código para disponibilizar o arquivo, o que consome horas de instâncias e gera custos.

Como disponibilizar arquivos diretamente do Google Cloud Storage

Existe uma forma mais rápida e econômica de exibir arquivos do aplicativo, conforme mencionado acima: exibi-los do Cloud Storage diretamente via HTTP. Os arquivos precisam ser configurados para serem lidos por usuários anônimos no momento da gravação do arquivo. Como mostraremos no snippet abaixo, você define a opção de stream acl como public-read.

Depois que o arquivo for gravado no Cloud Storage como publicamente legível, você precisará acessar o URL público do arquivo, usando CloudStorageTools::getPublicUrl.

No exemplo a seguir, criamos um arquivo legível publicamente com alguns números aleatórios, gravando-o em um bucket do Cloud Storage, e redirecionamos do Cloud Storage para esse arquivo.

$options = ['gs' => ['acl' => 'public-read']];
$context = stream_context_create($options);
$fileName = "gs://${my_bucket}/public_file.txt";
file_put_contents($fileName, $publicFileText, 0, $context);

$publicUrl = CloudStorageTools::getPublicUrl($fileName, false);

A limitação dessa abordagem é que não há controle sobre quem pode acessar o arquivo, porque ele pode ser lido por qualquer pessoa.

Como disponibilizar arquivos enviados com o aplicativo

Essa opção está descrita na íntegra nesta página.