Utilizzo di Cloud Storage

Puoi utilizzare Cloud Storage per archiviare e pubblicare file, come filmati o immagini o altri contenuti statici.

Questo documento descrive come utilizzare la libreria client di Google Cloud nell'app per archiviare dati e recuperare dati da Cloud Storage.

Prima di iniziare

  • Segui le istruzioni in "Hello, World!" per Node.js su App Engine per configurare il tuo ambiente e il tuo progetto e per capire come sono strutturate le app Node.js in App Engine. Annota e salva l'ID progetto, perché è necessario per eseguire l'applicazione di esempio descritta in questo documento.

  • Assicurati di creare un bucket di Cloud Storage per la tua applicazione richiamando il seguente comando:

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Rendi il bucket pubblicamente pubblico in modo che possa gestire file:

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

Scarica l'anteprima

Per clonare il repository:

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

Modifica la configurazione del progetto e installa le dipendenze

In app.yaml, aggiungi l'ID progetto al valore dell'ambiente GOOGLE_CLOUD_PROJECT. Quindi, imposta il valore dell'ambiente GCLOUD_STORAGE_BUCKET sul nome del bucket di Cloud Storage creato in precedenza.

runtime: nodejs
env: flex

env_variables:
  GCLOUD_STORAGE_BUCKET: YOUR_BUCKET_NAME

In package.json, aggiungi @google-cloud/storage come dipendenza, che fornisce le funzioni per utilizzare 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": ">= 12.20.0"
  },
  "dependencies": {
    "@google-cloud/storage": "^5.3.0",
    "express": "^4.17.0",
    "multer": "^1.4.2",
    "pug": "^3.0.0"
  },
  "devDependencies": {
    "mocha": "^9.0.0",
    "supertest": "^6.0.0",
    "proxyquire": "^2.1.3"
  }
}

Per le istruzioni di esecuzione e test in locale, consulta il file README.md.

Codice dell'applicazione

L'applicazione di esempio presenta una pagina web che chiede all'utente di fornire un file da archiviare in Cloud Storage. Quando l'utente seleziona un file e fa clic su Invia, il gestore del caricamento carica il contenuto del file in un blob e lo scrive in Cloud Storage.

Nota che, dopo il caricamento in Cloud Storage, viene restituito l'URL pubblico del file, che puoi utilizzare per pubblicare il file direttamente da Cloud Storage. Conserva questo valore nella tua app per usi futuri.

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();

  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.');
});

Per ulteriori informazioni

Per informazioni complete su Cloud Storage, consulta la documentazione di Cloud Storage.