Lire et écrire dans Google Cloud Storage

Ce document explique comment stocker et récupérer des données dans une application App Engine à l'aide de Cloud Storage et de la bibliothèque cliente Google Cloud Storage. Nous supposons ici que vous avez réalisé les tâches décrites dans la documentation Configuration de Google Cloud Storage pour activer un bucket Cloud Storage et télécharger les bibliothèques clientes. Cela suppose également que vous savez comment créer une application App Engine, comme décrit dans le guide de démarrage rapide de l'environnement standard App Engine pour Java 8.

Importations requises

L'extrait de code suivant illustre les importations dont vous avez besoin pour accéder à Cloud Storage via la bibliothèque cliente :

import com.google.appengine.tools.cloudstorage.GcsFileOptions;
import com.google.appengine.tools.cloudstorage.GcsFilename;
import com.google.appengine.tools.cloudstorage.GcsInputChannel;
import com.google.appengine.tools.cloudstorage.GcsOutputChannel;
import com.google.appengine.tools.cloudstorage.GcsService;
import com.google.appengine.tools.cloudstorage.GcsServiceFactory;
import com.google.appengine.tools.cloudstorage.RetryParams;

Spécifier le bucket Cloud Storage

L'extrait de code suivant illustre comment l'utilisateur peut spécifier un nom de bucket lorsqu'il cherche à écrire un fichier dans un bucket :

function uploadFile() {
  var bucket = document.forms["putFile"]["bucket"].value;
  var filename = document.forms["putFile"]["fileName"].value;
  if (bucket == null || bucket == "" || filename == null || filename == "") {
    alert("Both Bucket and FileName are required");
    return false;
  } else {
    var postData = document.forms["putFile"]["content"].value;
    document.getElementById("content").value = null;

    var request = new XMLHttpRequest();
    request.open("POST", "/gcs/" + bucket + "/" + filename, false);
    request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
    request.send(postData);
  }
}

Cet extrait de code ajoute le préfixe /gcs/ requis aux noms de bucket et de fichier fournis par l'utilisateur.

Écrire dans Cloud Storage

Pour écrire un fichier dans Cloud Storage :

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  GcsFileOptions instance = GcsFileOptions.getDefaultInstance();
  GcsFilename fileName = getFileName(req);
  GcsOutputChannel outputChannel;
  outputChannel = gcsService.createOrReplace(fileName, instance);
  copy(req.getInputStream(), Channels.newOutputStream(outputChannel));
}

Cet exemple de code écrit un nouveau fichier dans Cloud Storage ou, s'il existe déjà un fichier portant le même nom, l'écrase. Cela est utile car une fois qu'un fichier est écrit dans Cloud Storage, vous ne pouvez plus le modifier. Pour modifier le fichier, vous devez modifier votre propre copie, puis écraser l’ancien fichier.

Lecture à partir de Cloud Storage

Pour lire un fichier à partir de Cloud Storage :

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  GcsFilename fileName = getFileName(req);
  if (SERVE_USING_BLOBSTORE_API) {
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    BlobKey blobKey = blobstoreService.createGsBlobKey(
        "/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
    blobstoreService.serve(blobKey, resp);
  } else {
    GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(fileName, 0, BUFFER_SIZE);
    copy(Channels.newInputStream(readChannel), resp.getOutputStream());
  }
}

Dans la ligne contenant gcsService.openPrefetchingReadChannel, notez l'utilisation de la prérécupération. Cette méthode consiste à mettre les données en mémoire tampon et à les récupérer avant que cela ne soit effectivement nécessaire, afin d'éviter tout blocage lors de l'appel en lecture.

Étapes suivantes