Permitir que los usuarios suban archivos

ID de región

El REGION_ID es un código abreviado que Google asigna en función de la región que selecciones al crear tu aplicación. El código no corresponde a un país o provincia, aunque algunos IDs de región pueden parecerse a los códigos de país y provincia que se usan habitualmente. En las aplicaciones creadas después de febrero del 2020, REGION_ID.r se incluye en las URLs de App Engine. En las aplicaciones creadas antes de esa fecha, el ID de región es opcional en la URL.

Más información sobre los IDs de región

Cuando subes contenido directamente a Google Cloud Storage, envías una solicitud HTTP POST a una URL específica, que describiremos en un momento. A continuación, App Engine usa un servicio de subida específico para gestionar la publicación y escribir el archivo en Google Cloud Storage. Cuando se completa la escritura del archivo, App Engine notifica a tu aplicación que la subida se ha completado. Como tu aplicación solo se invoca cuando se completa la subida, puedes usar este método para subir archivos muy grandes, de hasta 100 terabytes (el máximo actual).

La subida de archivos por parte de los usuarios directamente a Google Cloud Storage es más rápida y rentable que escribir en Google Cloud Storage desde tu aplicación de App Engine, ya que esto consume horas de instancia y genera costes. Además, la escritura del archivo no se produce en una solicitud a la aplicación. Por lo tanto, está exento del tiempo de espera de la solicitud que se aplicaría de otro modo y permite subir archivos de gran tamaño.

Implementar subidas de archivos

Para implementar la subida de archivos por parte de los usuarios, sigue estos pasos:

  1. Importar CloudStorageTools:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Crea la URL de subida específica de la aplicación con el método CloudStorageTools::createUploadUrl() en tu archivo .php de la siguiente manera:

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

    Consulta las opciones de createUploadUrl para obtener más información sobre las opciones disponibles. Ten en cuenta que my_bucket será YOUR_APP_ID. REGION_ID.r.appspot.com si usas el segmento predeterminado.

  3. Ten en cuenta que debes empezar a subir contenido a esta URL en un plazo de 10 minutos desde su creación. Además, no puedes cambiar la URL de ninguna forma, ya que está firmada y la firma se comprueba antes de que empiece la subida.

  4. Usa esta URL como acción del formulario que utilices para aceptar subidas. 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 hayan subido los archivos, se enviará una solicitud POST a la ruta especificada como primer parámetro de createUploadUrl. En el ejemplo anterior, se trata de /upload_handler.php. El tiempo de ejecución de PHP forma la superglobal $_FILES correcta, y tmp_filename hace referencia al nombre del archivo recién subido en 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, podrías obtener 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)
  }
}

Cuando se haya completado la subida, podrá leer el archivo subido mediante el envoltorio de flujo gs://. Puedes usar move_uploaded_file como lo harías normalmente 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 válidas de createUploadUrl se muestran en la siguiente tabla:

Opción Descripción
max_bytes_per_blob Número entero. Valor predeterminado: unlimited. El valor del tamaño máximo permitido para un blob subido.
max_bytes_total Número entero. Valor predeterminado: unlimited. Tamaño total de todos los blobs subidos.
gs_bucket_name Cadena. Nombre del segmento de Google Cloud Storage al que se deben subir los blobs. Si no especifica ningún valor, el blob se sube al segmento predeterminado de la aplicación.