Utiliser Cloud Storage

Vous pouvez utiliser Cloud Storage pour stocker et diffuser des fichiers, tels que des films, des images ou d'autres contenus statiques.

Ce document explique comment utiliser la bibliothèque cliente Google Cloud dans votre application afin de stocker et de récupérer des données dans Cloud Storage.

Avant de commencer

  • Suivez les instructions de la section "Hello, World!" pour Node.js sur App Engine pour configurer votre environnement et votre projet et comprendre la structure des applications Node.js dans App Engine. Notez et enregistrez l'ID de votre projet. Vous en aurez besoin pour exécuter l'exemple d'application décrit dans ce document.

  • Veillez à créer un bucket Cloud Storage pour votre application en appelant la commande suivante :

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Rendez le bucket lisible publiquement afin qu'il puisse diffuser des fichiers :

    gsutil defacl set public-read gs://[YOUR_BUCKET_NAME]
    

Télécharger l'exemple

Pour cloner le dépôt, exécutez :

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/
cd nodejs-docs-samples/appengine/storage/standard

Modifier la configuration du projet et installer les dépendances

Dans app.yaml, ajoutez votre ID de projet à la valeur de l'environnement GOOGLE_CLOUD_PROJECT. Définissez ensuite la valeur de l'environnement GCLOUD_STORAGE_BUCKET sur le nom du bucket Cloud Storage que vous avez créé précédemment.

runtime: nodejs16

env_variables:
  GCLOUD_STORAGE_BUCKET: YOUR_BUCKET_NAME

Dans le fichier package.json, ajoutez @google-cloud/storage en tant que dépendance, ce qui fournit les fonctions permettant d'utiliser Cloud Storage.

{
  "name": "appengine-storage",
  "description": "Node.js Google Cloud Storage sample for Google App Engine",
  "scripts": {
    "start": "node app.js",
    "test": "mocha system-test/*.test.js --exit --timeout=30000"
  },
  "engines": {
    "node": ">=14.0.0"
  },
  "dependencies": {
    "@google-cloud/storage": "^6.0.0",
    "express": "^4.17.1",
    "multer": "^1.4.2",
    "pug": "^3.0.0"
  },
  "devDependencies": {
    "mocha": "^9.0.0",
    "supertest": "^6.0.0",
    "proxyquire": "^2.1.3"
  }
}

Consultez le fichier README.md pour obtenir des instructions sur l'exécution et le test en local.

Code d'application

L'exemple d'application présente une page Web invitant l'utilisateur à indiquer un fichier à stocker dans Cloud Storage. Lorsque l'utilisateur sélectionne un fichier et clique sur "Envoyer", le gestionnaire d'importation charge le contenu du fichier dans un blob et l'écrit dans Cloud Storage.

Notez qu'après le transfert du fichier dans Cloud Storage, l'URL publique de ce fichier est renvoyée. Vous pouvez l'utiliser pour diffuser le fichier directement à partir de Cloud Storage. Vous devez stocker cette valeur dans votre application pour une utilisation ultérieure.

const {format} = require('util');
const express = require('express');
const Multer = require('multer');

// By default, the client will authenticate using the service account file
// specified by the GOOGLE_APPLICATION_CREDENTIALS environment variable and use
// the project specified by the GOOGLE_CLOUD_PROJECT environment variable. See
// https://github.com/GoogleCloudPlatform/google-cloud-node/blob/master/docs/authentication.md
// These environment variables are set automatically on Google App Engine
const {Storage} = require('@google-cloud/storage');

// Instantiate a storage client
const storage = new Storage();

const app = express();
app.set('view engine', 'pug');

// This middleware is available in Express v4.16.0 onwards
app.use(express.json());

// Multer is required to process file uploads and make them available via
// req.files.
const multer = Multer({
  storage: Multer.memoryStorage(),
  limits: {
    fileSize: 5 * 1024 * 1024, // no larger than 5mb, you can change as needed.
  },
});

// A bucket is a container for objects (files).
const bucket = storage.bucket(process.env.GCLOUD_STORAGE_BUCKET);

// Display a form for uploading files.
app.get('/', (req, res) => {
  res.render('form.pug');
});

// Process the file upload and upload to Google Cloud Storage.
app.post('/upload', multer.single('file'), (req, res, next) => {
  if (!req.file) {
    res.status(400).send('No file uploaded.');
    return;
  }

  // Create a new blob in the bucket and upload the file data.
  const blob = bucket.file(req.file.originalname);
  const blobStream = blob.createWriteStream({
    resumable: false,
  });

  blobStream.on('error', err => {
    next(err);
  });

  blobStream.on('finish', () => {
    // The public URL can be used to directly access the file via HTTP.
    const publicUrl = format(
      `https://storage.googleapis.com/${bucket.name}/${blob.name}`
    );
    res.status(200).send(publicUrl);
  });

  blobStream.end(req.file.buffer);
});

const PORT = parseInt(process.env.PORT) || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

Pour en savoir plus

Pour obtenir des informations complètes sur Cloud Storage, consultez la documentation Cloud Storage.