Como permitir que usuários façam upload de arquivos

ID da região

O REGION_ID é um código abreviado que o Google atribui com base na região que você selecionou ao criar o aplicativo. O código não corresponde a um país ou estado, ainda que alguns IDs de região sejam semelhantes aos códigos de país e estado geralmente usados. Para apps criados após fevereiro de 2020, o REGION_ID.r está incluído nos URLs do App Engine. Para apps existentes criados antes dessa data, o ID da região é opcional no URL.

Saiba mais sobre IDs de região.

Ao fazer upload diretamente no Google Cloud Storage, você faz uma solicitação HTTP POST para um URL específico, que será descrito em breve. O App Engine usa um serviço de upload específico para processar a postagem e gravar o arquivo no Google Cloud Storage. Quando a gravação do arquivo é concluída, o Google App Engine notifica o aplicativo sobre o término do upload. Como seu aplicativo é invocado apenas após a conclusão, é possível usar este método para fazer upload de arquivos muito grandes, até o máximo atual de 100 terabytes.

O upload de arquivos diretamente para o Google Cloud Storage pelo usuário é mais rápido e econômico do que a gravação no Google Cloud Storage usando o aplicativo do App Engine, já que isso consome horas de instâncias e gera custos. Além disso, a gravação do arquivo não ocorre em uma solicitação para o aplicativo. Portanto, ele está isento do tempo limite da solicitação que se aplica e permite uploads de arquivos muito grandes.

Como implementar uploads de arquivos

Para implementar o upload de arquivos do usuário:

  1. Importe CloudStorageTools:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Crie o URL de upload específico do aplicativo, usando o método CloudStorageTools::createUploadUrl() no arquivo .php da seguinte maneira:

    $options = ['gs_bucket_name' => $my_bucket];
    $upload_url = CloudStorageTools::createUploadUrl('/upload/handler', $options);

    Consulte opções createUploadUrl para detalhes sobre as opções disponíveis. Observe que my_bucket será YOUR_APP_ID. REGION_ID.r.appspot.com se estiver usando o bucket padrão.

  3. É necessário iniciar o upload desse URL dentro de 10 minutos após a criação dele. Além disso, não é possível alterar o URL, que é assinado e a assinatura é verificada antes do início do upload.

  4. Use esse URL como a ação do formulário que você utiliza para aceitar uploads. Por exemplo:

    <form action="{{ upload_url }}" enctype="multipart/form-data" method="post">
        Files to upload: <br>
       <input type="file" name="uploaded_files" size="40">
       <input type="submit" value="Send">
    </form>

Após o upload dos arquivos, um POST é criado para o caminho especificado como o primeiro parâmetro para createUploadUrl. No exemplo acima, é /upload_handler.php. O ambiente de execução do PHP forma o $_FILES super global correto e tmp_filename refere-se ao nome do arquivo carregado recentemente no Google Cloud Storage.

Por exemplo, suponha que o conteúdo do upload_handler.php seja o seguinte:

var_dump($_FILES);

O upload de um arquivo chamado hello.txt pode resultar na seguinte saída:

array(1) {
  ['uploaded_files']=>
  array(5) {
    ['name']=>    string(14) 'hello.txt'
    ['type']=>    string(10) 'text/plain'
    ['tmp_name']=>    string(73) 'gs://my_bucket/L2FwcHMtdXBsb2FkL2Jsb2JzL2IxNUFBVGNJNXNTd0VqR0tFSUtDRGxadGc'
    ['error']=>    int(0)
    ['size']=>    int(1452)
  }
}

Após a conclusão do upload, leia o arquivo enviado usando o wrapper de stream gs://. Você usa move_uploaded_file como faria normalmente para qualquer outro arquivo enviado, por exemplo:

$file_name = $_FILES['uploaded_files']['name'];
$temp_name = $_FILES['uploaded_files']['tmp_name'];
move_uploaded_file($temp_name, "gs://${my_bucket}/${file_name}.txt");

Opções de createUploadUrl

As opções de createUploadUrl válidas são mostradas na seguinte tabela:

Opção Descrição
max_bytes_per_blob Número inteiro. Valor padrão: unlimited. O valor do maior tamanho permitido para um blob enviado.
max_bytes_total Número inteiro. Valor padrão: unlimited. O tamanho total de todos os blobs enviados.
gs_bucket_name String. O nome de um bucket do Google Cloud Storage ao qual os blobs devem ser enviados. Se você não especificar um valor, o upload do blob será feito para o intervalo padrão do aplicativo.