Usa Cloud Storage con Java para el entorno de App Engine Standard

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

Esta página forma parte de un instructivo de varias páginas. Para comenzar desde el principio y revisar las instrucciones de configuración, ve a la app de Bookshelf en Java.

Crea un depósito de Cloud Storage

En las instrucciones siguientes, se detalla cómo crear un depósito de Cloud Storage. Los depósitos son los contenedores básicos que conservan tus datos en Cloud Storage.

  1. En la ventana de tu terminal, crea un depósito de Cloud Storage, en el que YOUR_BUCKET_NAME represente el nombre de tu depósito con el comando siguiente:

    gsutil mb gs://YOUR_BUCKET_NAME
    
  2. Para ver las imágenes que se subieron en la aplicación Bookshelf, configura la Lista de control de acceso (LCA) predeterminada del depósito como public-read.

    gsutil defacl set public-read gs://YOUR_BUCKET_NAME
    

Ejecuta la app en tu máquina local

Para ejecutar la app de manera local:

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

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Reemplaza [YOUR-BUCKET] por el nombre del depósito.
  2. En tu navegador web, ve a http://localhost:8080.

Ahora puedes navegar por las páginas web de la app y agregar libros con imágenes de portada, así como editar y borrar libros.

Implementación de la app en el entorno estándar de App Engine

Para implementar en el entorno estándar de App Engine, haz lo siguiente:

  1. Para crear un índice del almacén de datos que se cargue en la aplicación Bookshelf, cree al menos un libro y, luego, haz clic en Mis libros. Ten en cuenta que compilar la aplicación con el comando clean borra ese índice local, así que haz esto en la compilación de la aplicación que vas a implementar.
  2. En el directorio getting-started-java/bookshelf-standard/3-binary-data, ingresa este comando para implementar la aplicación:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Reemplaza [YOUR-PROJECT-ID] por el ID del proyecto, y [YOUR-VERSION] por la versión, como 1, 2 o algún otro valor string que desees usar.
  4. En el navegador web, ingresa la siguiente URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Reemplaza lo siguiente:

Una vez que actualices la app, puedes volver a implementar la versión actualizada mediante el mismo comando que usaste cuando la implementaste por primera vez. Para ello, especifica el mismo ID del proyecto y la misma versión. Esto sobrescribe la aplicación implementada en la actualidad. Si especificas una cadena de versión diferente en la línea de comando actualizada, la nueva implementación crea una nueva versión de la aplicación y la promueve para que sea la versión de servicio actual.

Borra las versiones de la app que no estén en uso para reducir costos.

Para borrar la versión de una aplicación, haz lo siguiente:

  1. En Cloud Console, ve a la página Versiones de App Engine.

    Ir a la página Versiones

  2. Selecciona la casilla de verificación de la versión no predeterminada de la app que deseas borrar.
  3. Haz clic en Borrar para borrar la versión de la app.

Para obtener toda la información acerca de la limpieza de los recursos facturables, consulta la sección Limpieza del paso final de este instructivo.

Estructura de la app

Estructura de muestra de datos binarios

En este caso, la app usa Cloud Storage almacenar para datos binarios, como imágenes. La aplicación sigue usando Datastore para la información de los libro.

Comprende el código

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

Administra cargas de usuario

La API de Google Cloud Storage para Java es fácil de usar. En la mayoría de los casos basta con una sola línea para realizar la autenticación de manera local.

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

Sube BLOB a Cloud Storage

Antes de subir el archivo, verifica que cumpla con tus requisitos.


/**
 * 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");
  }
}

Colócale una marca de tiempo al nombre del archivo para que sea único. Mediante storage.create , pasa un BlobInfo creado con bucketName y fileName y configura la lista de control de acceso para que todos los usuarios puedan leer y pasar el archivo InputStream. El resultado es la URL pública del 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();
}