Usa Cloud Storage con Java

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]

    Define la configuración

    Cómo ejecutar 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/3-binary-data, ingresa el siguiente comando para iniciar un servidor web local. Reemplaza [YOUR_PROJECT_ID] por el ID del proyecto de GCP:

      mvn -Plocal clean jetty:run-exploded -DprojectID=[YOUR-PROJECT-ID]
    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.

    Implementa la app en el entorno de App Engine Flexible

    1. Implementa la app.

      mvn appengine:deploy -DprojectID=YOUR-PROJECT-ID
      
    2. En el navegador web, ingresa la siguiente dirección. Reemplaza [YOUR_PROJECT_ID] por el ID del proyecto.

      https://[YOUR_PROJECT_ID].appspot-preview.com
      

    Si actualizas la app, podrás implementar la versión actualizada con el mismo comando que usaste para implementarla por primera vez. La implementación nueva crea una versión nueva de la app y la convierte en la versión predeterminada. Las versiones anteriores de la app se conservan, al igual que sus instancias de VM asociadas. Todas estas instancias de VM y versiones de la app son recursos facturables.

    Para reducir costos, borra las versiones no predeterminadas 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

    Como se ilustra en el siguiente diagrama, la app usa Cloud Storage para almacenar datos binarios, como imágenes en este caso. La app sigue usando Cloud Datastore para almacenar la información de los libros.

    Estructura de muestra de datos binarios

    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

    Lee el archivo de una solicitud POST con getPart. Antes de subir el archivo, verifica que cumpla con los requisitos que definiste.

    /**
     * Extracts the file payload from an HttpServletRequest, checks that the file extension
     * is supported and uploads the file to Google Cloud Storage.
     */
    public String getImageUrl(HttpServletRequest req, HttpServletResponse resp,
                              final String bucket) throws IOException, ServletException {
      Part filePart = req.getPart("file");
      final String fileName = filePart.getSubmittedFileName();
      String imageUrl = req.getParameter("imageUrl");
      // Check extension of file
      if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) {
        final String extension = fileName.substring(fileName.lastIndexOf('.') + 1);
        String[] allowedExt = {"jpg", "jpeg", "png", "gif"};
        for (String s : allowedExt) {
          if (extension.equals(s)) {
            return this.uploadFile(filePart, bucket);
          }
        }
        throw new ServletException("file must be an image");
      }
      return imageUrl;
    }

    Luego, 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(Part filePart, final String bucketName) throws IOException {
      DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
      DateTime dt = DateTime.now(DateTimeZone.UTC);
      String dtString = dt.toString(dtf);
      final String fileName = filePart.getSubmittedFileName() + 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(),
              filePart.getInputStream());
      // return the public download link
      return blobInfo.getMediaLink();
    }
¿Te ha resultado útil esta página? Enviar comentarios: