Consentire agli utenti di caricare file

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata al momento della creazione dell'app. Il codice non corrispondono a un paese o a una provincia, anche se potrebbero essere visualizzati alcuni ID regione in modo simile ai codici paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Quando carichi direttamente su Google Cloud Storage, crei un POST HTTP su un URL specifico, che noi a descrivere in un attimo. App Engine utilizza quindi un servizio di caricamento specifico per gestire post e scrivi il file in Google Cloud Storage. Al termine della scrittura del file, App Engine informa la tua app del completamento del caricamento. Poiché l'app viene invocata solo al termine, puoi utilizzare questo metodo per caricare file di grandi dimensioni, fino al valore massimo corrente di 100 terabyte.

Il caricamento da parte degli utenti dei file direttamente in Google Cloud Storage è più veloce e conveniente rispetto di scrivere su Google Cloud Storage dall'app App Engine, perché consuma ore di istanza e comporta costi. Inoltre, la scrittura del file non avviene all'interno di una richiesta all'applicazione. Di conseguenza è esente dal timeout della richiesta che altrimenti sarebbero applicabili e consente di caricare file di grandi dimensioni.

Implementazione dei caricamenti di file

Per implementare il caricamento dei file utente:

  1. Importa CloudStorageTools:

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Crea l'URL di caricamento specifico dell'applicazione utilizzando il metodo CloudStorageTools::createUploadUrl() nel file .php come segue:

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

    Per informazioni dettagliate sulle opzioni disponibili, consulta Opzioni createUploadUrl. Tieni presente che my_bucket sarà YOUR_APP_ID. REGION_ID.r.appspot.com se utilizzi il bucket predefinito.

  3. Tieni presente che devi iniziare il caricamento su questo URL entro 10 minuti dalla sua per la creazione di contenuti. Inoltre, non puoi modificare l'URL in alcun modo: è firmato e viene verificata prima dell'inizio del caricamento.

  4. Utilizza questo URL come azione per il modulo che utilizzi per accettare i caricamenti, ad esempio:

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

Dopo il caricamento dei file, viene eseguito un POST al percorso specificato come primo parametro di createUploadUrl; nell'esempio precedente, si tratta di /upload_handler.php. Il runtime PHP forma il superglobale $_FILES corretto e tmp_filename fa riferimento al nome del file appena caricato in Google Cloud Storage.

Ad esempio, supponiamo che i contenuti di upload_handler.php siano i seguenti:

var_dump($_FILES);

Il caricamento di un file denominato hello.txt potrebbe generare il seguente output:

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

Al termine del caricamento, puoi leggere il file caricato utilizzando lo Wrapper stream gs://. Utilizza move_uploaded_file come faresti normalmente per qualsiasi altro file caricato, ad esempio:

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

Opzioni createUploadUrl

Le opzioni createUploadUrl valide sono riportate nella tabella seguente:

Opzione Descrizione
max_bytes_per_blob Numero intero. Valore predefinito: unlimited. Il valore della dimensione massima consentita per un blob caricato.
max_bytes_total Numero intero. Valore predefinito: unlimited. La dimensione totale di tutti i blob caricati.
gs_bucket_name Stringa. Il nome di un bucket Google Cloud Storage in cui devono essere caricati i blob. Se non specifichi un valore, il blob viene caricato nel bucket predefinito dell'applicazione.