Como usar o Google Cloud Storage com Java para o ambiente padrão do App Engine

Esta parte do tutorial Bookshelf para Java mostra como armazenar imagens no Cloud Storage.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, consulte App Bookshelf em Java.

Crie um bucket do Cloud Storage

Veja nas instruções a seguir como criar um bucket do Cloud Storage. buckets são os contêineres básicos que armazenam dados no Cloud Storage.

  1. Na janela do terminal, crie um bucket do Cloud Storage em que YOUR_BUCKET_NAME representa o nome do bucket:

    gsutil mb gs://YOUR_BUCKET_NAME
    
  2. Para visualizar imagens carregadas no app Bookshelf, defina a lista de controle de acesso (ACL, na sigla em inglês) padrão do intervalo como public-read:

    gsutil defacl set public-read gs://YOUR_BUCKET_NAME
    

Execução do app na máquina local

Para executar o app localmente:

  1. No diretório getting-started-java/bookshelf-standard/3-binary-data, digite o seguinte comando para iniciar um servidor da Web local:

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Substitua [YOUR_BUCKET] pelo nome do seu bucket.
  2. No seu navegador da Web, acesse http://localhost:8080.

Agora você pode procurar as páginas da Web do app e adicionar, editar e excluir livros.

Como implantar o app no ambiente padrão do App Engine

Para implantar no ambiente padrão do App Engine:

  1. Para criar um índice do armazenamento de dados carregado no aplicativo Bookshelf, crie pelo menos um livro e clique em Meus Livros. Observe que a criação do aplicativo usando o comando clean exclui esse índice local. Faça isso na construção do aplicativo que você irá implantar.
  2. No diretório getting-started-java/bookshelf-standard/3-binary-data, digite este comando para implantar o app:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Substitua [YOUR-PROJECT-ID] pelo código do projeto e [YOUR-VERSION] pela versão, por exemplo, 1, 2 ou outro valor de string que você queira usar.
  4. No navegador da Web, digite este URL:

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

    Substitua:

Depois de atualizar seu aplicativo, você pode reimplementar a versão atualizada digitando o mesmo comando de quando o aplicativo foi implantado pela primeira vez, além de especificar o mesmo ID e versão do projeto. Isso substitui o aplicativo implantado no momento. Se você especificar uma sequência de versão diferente na linha de comando atualizada, a nova implantação criará uma nova versão do seu aplicativo e promoverá que ela seja a versão atualmente veiculada.

Reduza custos excluindo as versões do app que não estão veiculadas.

Para excluir uma versão do app:

  1. No Console do Cloud, acesse a página Versões do App Engine.

    Acessar a página "Versões"

  2. Marque a caixa de seleção da versão não padrão do app que você quer excluir.
  3. Clique em Excluir para remover a versão do app.

Para informações detalhadas sobre a remoção de recursos faturáveis, consulte a seção Como fazer a limpeza na etapa final deste tutorial.

Estrutura do app

Amostra de estrutura de dados binários

O aplicativo usa o Cloud Storage para armazenar dados binários, como imagens neste caso. O aplicativo continua usando o Datastore para receber informações sobre livros.

Como entender o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

Processar uploads de usuários

É simples usar a API do Cloud Storage para Java. Na maioria dos casos, você só precisa de uma única linha para autenticação local.

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

Fazer upload de blobs para o Cloud Storage

Verifique se o arquivo está de acordo com os requisitos antes de fazer o upload.


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

Faça o nome do arquivo ser único anexando a ele data e hora. Usando storage.create, transmita um BlobInfo criado com bucketName e fileName e defina o lista de controle de acesso para que todos os usuários possam ler e passar o arquivo InputStream. O resultado é o URL público do 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();
}