Permite que los usuarios suban archivos

ID de región

REGION_ID es un código abreviado que Google asigna en función de la región que seleccionas cuando creas la app. El código no corresponde a un país ni a una provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia que se suelen usar. En el caso de las apps creadas después de febrero de 2020, REGION_ID.r se incluye en las URL de App Engine. En el caso de las apps existentes creadas antes de esta fecha, el ID de región es opcional en la URL.

Obtén más información acerca de los ID de región.

Cuando subes archivos directo a Google Cloud Storage, creas una HTTP POST en una URL específica (lo explicaremos en breve). Luego, App Engine usa un servicio de cargas específico para manejar la publicación y escribir el archivo en Google Cloud Storage. Cuando finaliza la escritura del archivo, App Engine notifica a tu aplicación que ya se realizó la carga. Dado que solo se invoca a la aplicación una vez que se completa la carga, puedes usar este método para subir archivos muy grandes (hasta el máximo actual de 100 terabytes).

Es más rápido y rentable que los usuarios suban los archivos directo a Google Cloud Storage que escribir a Google Cloud Storage desde tu aplicación de App Engine, ya que esto consume horas de instancia y genera un costo. Además, el archivo no se escribe con una solicitud a la aplicación. Por lo tanto, está exento del tiempo de espera de la solicitud que, de lo contrario, se aplicaría y permite subir archivos muy grandes.

Implementa cargas de archivos

Para implementar la carga de archivos por parte de los usuarios, haz lo siguiente:

  1. Importa CloudStorageTools:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Crea la URL de carga específica de la aplicación con el método CloudStorageTools::createUploadUrl() en tu archivo .php, como se muestra a continuación:

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

    Para obtener más detalles sobre las opciones disponibles, consulta las opciones de createUploadUrl. Ten en cuenta que my_bucket será YOUR_APP_ID. REGION_ID.r.appspot.com si usas el bucket predeterminado.

  3. Recuerda que debes empezar a subir archivos a esta URL dentro de los 10 minutos posteriores a su creación. Además, no puedes modificar la URL en absoluto, ya que está firmada y la firma se verifica antes de que comience la carga.

  4. Usa esta URL como la acción para el formulario que usas cuando aceptas cargas, por ejemplo:

    <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>

Una vez que se suben los archivos, se crea una solicitud POST a la ruta que se especificó como el primer parámetro de createUploadUrl; en el ejemplo anterior, es /upload_handler.php. El entorno de ejecución del PHP crea los $_FILES correctos súper globales y tmp_filename se refiere al nombre del archivo recién subido a Google Cloud Storage.

Por ejemplo, supongamos que el contenido de upload_handler.php es el siguiente:

var_dump($_FILES);

Si subes un archivo llamado hello.txt, puede que se muestre el siguiente 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)
  }
}

Una vez que se completa la carga, puedes leer el archivo que se subió con el wrapper de transmisión gs://. Usa move_uploaded_file como harías con cualquier otro archivo subido, por ejemplo:

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

Opciones de createUploadUrl

Las opciones de createUploadUrl se muestran en la siguiente tabla:

Opción Descripción
max_bytes_per_blob Número entero. Valor predeterminado: unlimited. Es el valor del mayor tamaño de BLOB que se puede subir.
max_bytes_total Número entero. Valor predeterminado: unlimited. Es el tamaño total de los BLOB que se subieron.
gs_bucket_name String. Es el nombre del bucket de Google Cloud Storage al que deberían subirse los BLOB. Si no especificas un valor, el BLOB se sube al bucket predeterminado de la aplicación.