Usa Cloud Storage

Puedes utilizar Cloud Storage para almacenar y entregar archivos, como películas, imágenes u otro tipo de contenido estático.

En este documento, se describe cómo utilizar la biblioteca cliente de Google Cloud en tu app para almacenar y recuperar datos de Cloud Storage.

Antes de comenzar

  • Sigue las instrucciones que se detallan en "¡Hola, mundo!" para Node.js en App Engine a fin de configurar tu entorno y tu proyecto, y entender cómo se estructuran las aplicaciones de Node.js en App Engine. Anota y guarda el ID del proyecto porque lo necesitarás para ejecutar la aplicación de muestra que se describe en este documento.

  • Asegúrate de crear un depósito de Cloud Storage para tu aplicación con este comando:

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Haz que el depósito pueda leerse públicamente para que pueda entregar archivos:

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

Descarga la muestra

Para clonar el repositorio:

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

Instala dependencias y edita la configuración del proyecto

En app.yaml, agrega tu ID del proyecto al valor de entorno GOOGLE_CLOUD_PROJECT. Luego, configura el valor de entorno GCLOUD_STORAGE_BUCKET con el nombre del depósito de Cloud Storage que creaste anteriormente.

runtime: nodejs10

env_variables:
  GCLOUD_STORAGE_BUCKET: YOUR_BUCKET_NAME

En package.json, agrega @google-cloud/storage como dependencia, la cual proporciona las funciones para utilizar 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": ">=8.0.0"
  },
  "dependencies": {
    "@google-cloud/storage": "^3.0.0",
    "body-parser": "^1.18.3",
    "express": "^4.16.4",
    "multer": "^1.4.1",
    "pug": "^2.0.3"
  },
  "devDependencies": {
    "@google-cloud/nodejs-repo-tools": "^3.3.0",
    "mocha": "^6.0.0"
  },
  "cloud-repo-tools": {
    "requiresProjectId": true,
    "requiresKeyFile": true,
    "test": {
      "app": {
        "requiredEnvVars": [
          "GCLOUD_STORAGE_BUCKET"
        ],
        "msg": "<input type=\"file\" name=\"file\">",
        "substitutions": "YOUR_BUCKET_NAME=$GCLOUD_STORAGE_BUCKET"
      },
      "build": {
        "requiredEnvVars": [
          "GCLOUD_STORAGE_BUCKET"
        ]
      }
    }
  }
}

Código de la aplicación

La aplicación de muestra presenta una página web en la que se solicita al usuario que proporcione un archivo para almacenarlo en Cloud Storage. Cuando el usuario selecciona un archivo y hace clic en Enviar, el controlador de carga sube el contenido del archivo en un BLOB y lo escribe en Cloud Storage.

Recuerda que, después de subir el archivo a Cloud Storage, se muestra la URL pública del archivo y podrás utilizarla para entregar el archivo directamente desde Cloud Storage. Debes guardar este valor en la app para utilizarlo más adelante.

const {format} = require('util');
const express = require('express');
const Multer = require('multer');
const bodyParser = require('body-parser');

// 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');
app.use(bodyParser.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 = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

Para obtener más información

Para obtener más información sobre Cloud Storage, consulta la documentación de Cloud Storage.