Autoriser les utilisateurs à importer des fichiers

ID de la région

Le REGION_ID est un code abrégé que Google attribue en fonction de la région que vous sélectionnez lors de la création de votre application. Le code ne correspond pas à un pays ou une province, même si certains ID de région peuvent ressembler aux codes de pays et de province couramment utilisés. Pour les applications créées après février 2020, REGION_ID.r est inclus dans les URL App Engine. Pour les applications existantes créées avant cette date, l'ID de région est facultatif dans l'URL.

En savoir plus sur les ID de région

Lorsque vous importez des fichiers directement dans Google Cloud Storage, vous créez une requête HTTP POST vers une URL spécifique. Cette étape est décrite ci-dessous. App Engine utilise ensuite un service d'importation spécifique pour gérer la requête POST et écrire le fichier dans Google Cloud Storage. Une fois l'écriture du fichier terminée, App Engine informe votre application que l'importation est terminée. Étant donné que votre application n'est appelée qu'à l'issue de l'opération, vous pouvez utiliser cette méthode pour importer des fichiers très volumineux, jusqu'à un maximum de 100 téraoctets.

L'importation de fichiers par l'utilisateur directement dans Google Cloud Storage est plus rapide et plus économique que l'écriture sur Google Cloud Storage à partir de votre application App Engine, car cette dernière consomme des heures d'utilisation de l'instance et entraîne donc des coûts. De plus, l'écriture de fichiers ne se produit pas dans une requête adressée à l'application. Par conséquent, cette méthode est exemptée du délai avant expiration de la requête qui s'applique généralement, et permet l'importation de très gros fichiers.

Mettre en œuvre des importations de fichiers

Pour mettre en œuvre l'importation de fichiers par l'utilisateur, procédez comme suit :

  1. Importez CloudStorageTools :

    use google\appengine\api\cloud_storage\CloudStorageTools;
  2. Créez l'URL d'importation spécifique à l'application en utilisant la méthode CloudStorageTools::createUploadUrl() dans le fichier .php comme suit :

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

    Consultez les options de createUploadUrl pour en savoir plus sur les options disponibles. Notez que my_bucket est appelé YOUR_APP_ID. REGION_ID.r.appspot.com si vous utilisez le bucket par défaut.

  3. Notez que vous devez commencer l'importation vers cette URL dans les 10 minutes suivant sa création. Par ailleurs, vous ne pouvez pas modifier l'URL de quelque manière que ce soit : celle-ci est signée et la signature est vérifiée avant le début de l'importation.

  4. Utilisez cette URL en tant qu'action du formulaire que vous utilisez pour accepter les importations, par exemple :

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

Une fois les fichiers importés, une requête POST est créée sur le chemin spécifié en tant que premier paramètre de createUploadUrl. Dans l'exemple ci-dessus, il s'agit de /upload_handler.php. L'environnement d'exécution PHP forme la variable superglobale $_FILES correspondante et tmp_filename fait référence au nom du fichier récemment importé dans Google Cloud Storage.

Par exemple, supposons que le contenu de "upload_handler.php" est le suivant :

var_dump($_FILES);

L'importation d'un fichier appelé hello.txt peut renvoyer le résultat suivant :

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

Une fois l'importation terminée, vous pouvez lire le fichier importé à l'aide du wrapper de flux gs://. Vous utilisez move_uploaded_file comme vous le feriez normalement pour tout autre fichier importé, par exemple :

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

Options createUploadUrl

Les options createUploadUrl valides sont indiquées dans le tableau suivant :

Option Description
max_bytes_per_blob Entier. Valeur par défaut : unlimited Taille maximale autorisée pour un blob importé.
max_bytes_total Entier. Valeur par défaut : unlimited Taille totale de tous les blobs importés.
gs_bucket_name Chaîne. Nom d'un bucket Google Cloud Storage dans lequel les blobs sont importés. Si vous ne spécifiez pas de valeur, le blob est importé dans le bucket par défaut de l'application.