Permitir que os utilizadores carreguem ficheiros

ID da região

O REGION_ID é um código abreviado que a Google atribui com base na região que seleciona quando cria a sua app. O código não corresponde a um país ou uma província, embora alguns IDs de regiões possam parecer semelhantes aos códigos de países e províncias usados frequentemente. Para apps criadas após fevereiro de 2020, REGION_ID.r está incluído nos URLs do App Engine. Para apps existentes criadas antes desta data, o ID da região é opcional no URL.

Saiba mais acerca dos IDs de regiões.

Quando carrega diretamente para o Google Cloud Storage, faz um HTTP POST para um URL específico, que vamos descrever dentro de momentos. Em seguida, o App Engine usa um serviço de carregamento específico para processar a publicação e escrever o ficheiro no Google Cloud Storage. Quando a gravação do ficheiro estiver concluída, o App Engine envia uma notificação à sua app a indicar que o carregamento está concluído. Uma vez que a sua app só é invocada após a conclusão, pode usar este método para carregar ficheiros muito grandes, até ao máximo atual de 100 terabytes.

O carregamento de ficheiros pelo utilizador diretamente para o Google Cloud Storage é mais rápido e rentável do que escrever no Google Cloud Storage a partir da sua app do App Engine, uma vez que isto consome horas de instância e incorre em custos. Além disso, a gravação de ficheiros não ocorre num pedido à aplicação. Por conseguinte, está isento do tempo limite de pedido que, de outra forma, se aplicaria e permite carregamentos de ficheiros muito grandes.

Implementar carregamentos de ficheiros

Para implementar o carregamento de ficheiros de utilizadores:

  1. Importar CloudStorageTools:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Crie o URL de carregamento específico da aplicação através do método CloudStorageTools::createUploadUrl() no seu ficheiro .php da seguinte forma:

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

    Consulte as opções de createUploadUrl para ver detalhes sobre as opções disponíveis. Tenha em atenção que my_bucket vai ser YOUR_APP_ID. REGION_ID.r.appspot.com se usar o contentor predefinido.

  3. Tenha em atenção que tem de começar o carregamento para este URL no prazo de 10 minutos após a respetiva criação. Além disso, não pode alterar o URL de forma alguma. O URL é assinado e a assinatura é verificada antes do início do carregamento.

  4. Use este URL como a ação do formulário que usa para aceitar carregamentos, 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 carregamento dos ficheiros, é feito um POST para o caminho especificado como o primeiro parâmetro para createUploadUrl; no exemplo acima, este é /upload_handler.php. O tempo de execução do PHP forma a super global $_FILES correta e tmp_filename refere-se ao nome do ficheiro do ficheiro carregado recentemente no Google Cloud Storage.

Por exemplo, suponhamos que o conteúdo de upload_handler.php é o seguinte:

var_dump($_FILES);

O carregamento de um ficheiro denominado hello.txt pode resultar no seguinte resultado:

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 carregamento, pode ler o ficheiro carregado através do wrapper de fluxo gs://. Use move_uploaded_file como faria normalmente para qualquer outro ficheiro carregado, 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 createUploadUrl válidas são apresentadas na tabela seguinte:

Opção Descrição
max_bytes_per_blob Número inteiro. Valor predefinido: unlimited. O valor do tamanho máximo permitido para um blob carregado.
max_bytes_total Número inteiro. Valor predefinido: unlimited. O tamanho total de todos os blobs carregados.
gs_bucket_name String. O nome de um contentor do Google Cloud Storage para o qual os blobs devem ser carregados. Se não especificar um valor, o blob é carregado para o contentor predefinido da aplicação.