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

Nesta parte do tutorial do Bookshelf para Java, você aprenderá como armazenar imagens no Google 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, acesse App Bookshelf em Java.

Como criar um intervalo do Google Cloud Storage

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

Para criar um intervalo:

  1. Chame o seguinte comando em uma janela de terminal:

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

  2. Configure a Access Control List padrão do intervalo como public-read para que os usuários vejam as imagens que eles enviaram:

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

Como executar o aplicativo na máquina local

Para executar o aplicativo localmente:

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

    mvn -Plocal clean appengine:devserver -Dbookshelf.bucket=[YOUR-BUCKET]
    Substitua [YOUR_BUCKET] pelo nome do seu intervalo.
  2. No seu navegador, acesse http://localhost:8080.

Agora você pode procurar as páginas da Web do app, adicionar livros com imagens de capa, editá-los e exclui-los.

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

Para implantar no ambiente padrão do App Engine:

  1. Faça um teste completo do aplicativo Bookshelf localmente, inclusive com a criação de pelo menos um livro e um clique em Meus livros. Com isso, você cria um índice obrigatório de Cloud Datastore que é carregado com o Bookshelf. Observe que o índice local será excluído se você criar o aplicativo usando clean. Assim, faça isso na versão do aplicativo que você vai implantar.
  2. No diretório getting-started-java/bookshelf-standard/3-binary-data, insira este comando para implantar o aplicativo:
    mvn appengine:update -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.
  3. No navegador da Web, digite este endereço.
    https://[YOUR-PROJECT-ID].appspot.com
    Substitua [YOUR-PROJECT-ID] pelo código do projeto.

Depois de atualizar o app, você poderá implantar novamente a versão atualizada inserindo o mesmo comando usado para implantar o app na primeira vez, especificando o mesmo código de projeto e versão, substituindo assim o app implantando atualmente. Se você especificar uma string de versão diferente na linha de comando de atualização, a nova implantação criará uma nova versão do seu app e a definirá como a versão atual em veiculação.

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

Para excluir uma versão do aplicativo:

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

    Acessar a página Versões

  2. Clique na caixa de seleção ao lado da versão do aplicativo não padrão que você quer excluir.
  3. Clique no botão Excluir na parte superior da página para excluir a versão do aplicativo.

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 aplicativo

Exemplo de estrutura de dados binários

O aplicativo usa o Google Cloud Storage para armazenar dados binários (neste caso, imagens). Este app continua a usar o Cloud Datastore para informações sobre o livro.

Como entender o código

Nesta seção, vamos analisar o código do aplicativo e explicar como ele funciona.

Como processar uploads do usuário

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

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

Como fazer upload de blobs para o Google 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, passe uma BlobInfo criada com bucketName e fileName e configure o arquivo Access Control List para que todos os usuários possam ler e passar o InputStream do arquivo. 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();
}
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…