Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Tornar publico Bucket Amazon

Olá a todos, preciso chamar o método withCannedAcl e passar como argumento desse método uma ENUM de leitura pública, com isso, quando as imagens dos livros forem cadastradas no Bucket, terão uma visibilidade pública de leitura e todos os usuários irão conseguir visualizar as imagens no meu arquivo filesaver abaixo. Tentei inserir de várias formas mas não estou conseguindo, alguém poderia me ajudar?

esse é o trecho do método do código que extraí do blog da Alura "Realizando cadastros de imagens com a Amazon AWS e Spring MVC" do Rafael Nercessian

withCannedAcl(CannedAccessControlList.PublicRead));

Esse é o arquivo filesaver onde preciso inserir o método acima

@RequestScoped
public class FileSaver {

    private static final String CONTENT_DISPOSITION = "content-disposition";

    private static final String FILENAME_KEY = "filename=";

    @Inject
    private AmazonS3Client s3;    

    public String write(String baseFolder, Part multipartFile) {
        AmazonS3Client s3 = client();
        String fileName = extractFilename(multipartFile.getHeader(CONTENT_DISPOSITION));
        try {
            s3.putObject("superkovalev", fileName,
                    multipartFile.getInputStream(),                    
                    new ObjectMetadata());            
                    return "https://s3.amazonaws.com/xxxxxxxxxxxxxx/"                            
                    +fileName;
        } catch (AmazonClientException | IOException e) {
            throw new RuntimeException(e);
        }
    }

    private AmazonS3Client client() {
        AWSCredentials credentials = new BasicAWSCredentials("xxxxxxxx ",
                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        AmazonS3Client newClient = new AmazonS3Client(credentials, new ClientConfiguration());
        newClient.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
        return newClient;
    }

    private String extractFilename(String contentDisposition) {

        if (contentDisposition == null) {
            return null;
        }
        int startIndex = contentDisposition.indexOf(FILENAME_KEY);
        if (startIndex == -1) {
            return null;
        }
        String filename = contentDisposition.substring(startIndex
                + FILENAME_KEY.length());
        if (filename.startsWith("\"")) {
            int endIndex = filename.indexOf("\"", 1);
            if (endIndex != -1) {
                return filename.substring(1, endIndex);
            }
        } else {
            int endIndex = filename.indexOf(";");
            if (endIndex != -1) {
                return filename.substring(0, endIndex);
            }
        }
        return filename;
    }

    public AmazonS3Client getS3() {
        return s3;
    }

    public void setS3(AmazonS3Client s3) {
        this.s3 = s3;
    }

}

2 respostas
solução!

Fala Sérgio, tudo bem?

Pelo que entendi seu bucket já está criado, nesse caso você precisa alterar a política de acesso dele:

Policy bucket_policy = new Policy().withStatements(
    new Statement(Statement.Effect.Allow)
        .withPrincipals(Principal.AllUsers)
        .withActions(S3Actions.GetObject)
        .withResources(new Resource(
            "arn:aws:s3:::" + bucket_name + "/*")));

Link com informações para gerenciar policies: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-bucket-policies.html

Oi Otávio obrigado de novo.

Funcionou perfeitamente

Valeu!!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software