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 siguientes instrucciones, se muestra 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 una ventana de la terminal, ingresa el siguiente comando:

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

    Leyenda:

    • [YOUR-BUCKET-NAME] representa el nombre de tu depósito de Cloud Storage.
  2. Para ver las imágenes que se subieron en la app de 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, haz lo siguiente:

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

      mvn -Plocal clean appengine:devserver -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 de App Engine Standard, haz lo siguiente:

    1. Para crear un índice en Cloud Datastore que se suba a la app de Bookshelf, crea por lo menos un libro, y, luego, haz clic en Mis libros. Ten en cuenta que, si compilas la app con el comando clean, se borra ese índice local, por lo que debes hacerlo en la versión de la app que vas a implementar.
    2. En el directorio getting-started-java/bookshelf-standard/3-binary-data, ingresa este comando para implementar la aplicación:
      mvn appengine:update -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
      Reemplaza [YOUR-PROJECT-ID] por tu ID del proyecto, y [YOUR-VERSION] por tu versión, como 1, 2 o algún otro valor de string que quieras usar.
    3. En el navegador web, ingresa la siguiente dirección:
      https://[YOUR-PROJECT-ID].appspot.com
      Reemplaza [YOUR-PROJECT-ID] por el ID del proyecto.

    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 reemplazará la app implementada actualmente. Si especificas una string de versión diferente en la línea de comandos actualizada, la implementación nueva crea una versión nueva de la app y la convierte a la versión actualmente en uso.

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

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

    1. In the GCP Console, go to the Versions page for App Engine.

      Go to the Versions page

    2. Select the checkbox for the non-default app version you want to delete.
    3. Click Delete to delete the app version.

    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 app sigue usando Cloud Datastore para almacenar la información de los libros.

    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 los requisitos que definiste.

    /**
     * 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. Con 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 InputStream del archivo. 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();
    }
¿Te ha resultado útil esta página? Enviar comentarios: