Uso de Cloud Storage con Java para el entorno estándar de App Engine

En esta parte del tutorial de Bookshelf para Java, se explica cómo almacenar imágenes en Google Cloud Storage.

Esta página forma parte de un tutorial de varias páginas. Para empezar en orden y consultar las instrucciones de configuración, accede a la aplicación Bookshelf de Java.

Crear un segmento de Cloud Storage

En las siguientes instrucciones, se explica cómo crear un segmento de Cloud Storage. Los segmentos son los contenedores básicos que contienen los datos en Cloud Storage.

Para crear un segmento, sigue estas instrucciones:

  1. Invoca el siguiente comando en una ventana del terminal:

    gsutil mb gs://[YOUR-BUCKET-NAME]

  2. Configura la ACL predeterminada del segmento como public-read, para que los usuarios puedan ver las imágenes que suban:

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

Ejecutar la aplicación en la máquina local

Para ejecutar la aplicación de forma local, sigue estas instrucciones:

  1. En el directorio getting-started-java/bookshelf-standard/3-binary-data, introduce el siguiente comando para iniciar un servidor web local:

    mvn -Plocal clean appengine:devserver -Dbookshelf.bucket=[YOUR-BUCKET]
    Sustituye [YOUR-BUCKET] por el nombre del segmento.
  2. En el navegador web, accede a http://localhost:8080.

Ahora puedes navegar por las páginas web de la aplicación, donde podrás agregar libros con imágenes de portada, editar y eliminar libros.

Desplegar la aplicación en el entorno estándar de App Engine

Para realizar el despliegue en el entorno estándar de App Engine, sigue estos pasos:

  1. Asegúrate de haber utilizado la aplicación Bookshelf de forma completamente local, especialmente mediante la creación de al menos un libro, y luego haz clic en Mis libros. Al hacerlo, se crea un índice de Cloud Datastore obligatorio que se carga con Bookshelf. Ten en cuenta que compilar la aplicación mediante clean elimina ese índice local, así que asegúrate de hacer esto en la compilación de la aplicación que vas a desplegar.
  2. Para desplegar la aplicación, introduce el comando que figura a continuación en el directorio getting-started-java/bookshelf-standard/3-binary-data:
    mvn appengine:update -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Sustituye [YOUR-PROJECT-ID] por el ID del proyecto y [YOUR-VERSION] por la versión, por ejemplo, 1, o 2, o algún otro valor de cadena que quieras usar.
  3. Introduce la siguiente dirección en el navegador web:
    https://[YOUR-PROJECT-ID].appspot.com
    Sustituye [YOUR-PROJECT-ID] por el ID del proyecto.

Después de actualizar la aplicación, puedes volver a desplegar la versión actualizada ejecutando el mismo comando que la primera vez, especificando el mismo ID y la versión del proyecto. Esto sobrescribe la aplicación desplegada actualmente. Si especificas una cadena con una versión diferente en la línea de comandos de actualización, el nuevo despliegue crea una nueva versión de la aplicación y la promociona para que sea la versión publicada actual.

Si eliminas las versiones no publicadas de la aplicación, puedes reducir los costes.

Para eliminar una versión de la aplicación, sigue las instrucciones que figuran a continuación:

  1. En GCP Console, dirígete a la página Versiones de App Engine.

    Ir a la página de Versiones

  2. Haz clic en la casilla de verificación junto a la versión de app no predeterminada que deseas borrar.
  3. Haz clic en el botón Borrar en la parte superior de la página para borrar la versión de la app.

Si quieres obtener información completa sobre cómo limpiar los recursos facturables, consulta la sección de limpieza en el último paso de este tutorial.

Estructura de la aplicación

Estructura de muestra de datos binarios

La aplicación usa Cloud Storage para almacenar datos binarios (imágenes en este caso). La aplicación continúa usando Cloud Datastore para obtener información sobre el libro.

Comprender el código

En esta sección se explica detalladamente el código de la aplicación y su funcionamiento.

Administrar las subidas de los usuarios

Resulta muy sencillo utilizar la API de Google Cloud Storage para Java. En la mayoría de los casos, una sola línea es todo lo que necesitas para autenticarte localmente.

static {
  storage = StorageOptions.getDefaultInstance().getService();
}

Subir blobs a Cloud Storage

Comprueba que el archivo coincida con tus requisitos antes de subirlo.

/**
 * Checks that the file extension is supported.
 */
private void checkFileExtension(String fileName) throws ServletException {
  if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) {
    String[] allowedExt = { ".jpg", ".jpeg", ".png", ".gif" };
    for (String ext : allowedExt) {
      if (fileName.endsWith(ext)) {
        return;
      }
    }
    throw new ServletException("file must be an image");
  }
}

A continuación, haz que el nombre del archivo sea único añadiendo una marca de tiempo. Mediante storage.create, pasa una BlobInfo creada con bucketName y fileName, y establece la lista de control de acceso para que todos los usuarios puedan leer y pasar el InputStream del archivo. El resultado es la URL pública para el objeto.

/**
 * Uploads a file to Google Cloud Storage to the bucket specified in the BUCKET_NAME
 * environment variable, appending a timestamp to end of the uploaded filename.
 */
@SuppressWarnings("deprecation")
public String uploadFile(FileItemStream fileStream, final String bucketName)
    throws IOException, ServletException {
  checkFileExtension(fileStream.getName());

  DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
  DateTime dt = DateTime.now(DateTimeZone.UTC);
  String dtString = dt.toString(dtf);
  final String fileName = fileStream.getName() + dtString;

  // the inputstream is closed by default, so we don't need to close it here
  BlobInfo blobInfo =
      storage.create(
          BlobInfo
              .newBuilder(bucketName, fileName)
              // Modify access list to allow all users with link to read file
              .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))))
              .build(),
          fileStream.openStream());
  // return the public download link
  return blobInfo.getMediaLink();
}
¿Te ha resultado útil esta página? Enviar comentarios: