Sabem me dizer como faço para ler o conteudo de um arquivo no AWS S3 com Spring Boot

Estou tentando criar um endpoint que le o conteudo de um arquivo dentro do meu bucket no S3 mas não estou conseguindo obter o conteudo dele, sabem me dizer se é possivel ?

    public String getObjectContent(final ContentObject req){
        final var s3object = amazonClient.getObject(bucketName, req.getName());
        return s3object.getObjectContent().toString();
    }

O getObjectContent() retorna um S3ObjectInputStream você tem que copiar os bytes desse stream para o seu stream de saída, por exemplo um arquivo:

S3ObjectInputStream inputStream = s3object.getObjectContent();
FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));
1 curtida

Eu gostaria de acessar o conteudo dele para conseguir salvar no banco de dados as informações, não preciso/quero criar outro arquivo

O @staroski apenas mencionou que é preciso ler o conteúdo do inputStream retornado e exemplificou que vc pode salvar em um arquivo, mas a partir do momento que vc tem o inputStream, vc pode recuperar os dados da forma que precisar. Supondo que seja um texto:

public String getS3ObjectContentAsString(String bucketName, String key) {
  try {
    if (key.startsWith("/")) {
      key = key.substring(1);
    }
    
    if (key.endsWith("/")) {
      key = key.substring(0, key.length());
    }
    
    try (InputStream is = s3Client.getObject(bucketName, key).getObjectContent()) {
      return StreamUtils.copyToString(is, StandardCharsets.UTF_8);
    }
  } catch (Exception e) {
    throw new IllegalStateException(e);
  }
}

FONTE: Java Read Amazon S3 Object as String | CodeFlex

Por isso você precisa ler o InputStream dele, salvar o conteúdo em arquivo foi só um exemplo.

Exatamente.

Consegui usando o IOUtils para ler o Stream conforme o @staroski falou

    @Override
    public String readFile(final FindObjectParameter findObjectParameter) throws IOException {
        bucketExist(findObjectParameter.getBucketName());
        final var s3Object = client.getObject(findObjectParameter.getBucketName(), findObjectParameter.getFileName());
        final var stream = s3Object.getObjectContent();
        return IOUtils.toString(stream);
    }

@gpd38 ajudou bastante tambem

1 curtida