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

JAVA EE = Fotos - s3 da Amazon

Olá pessoal, poderiam me ajudar? Não estou conseguindo exibir a foto que o método save armazenou no S3 da Amazon.

No campo da imagem aparece o link da foto e não a foto (exatamente o caminho que está sendo gravado no BD e o mesmo que consta dentro do bucket do S3 da Amazon)

se clicar no link que aparece no formulário, o retorno em outra pagina exibe 404- not found mas a foto está gravada no bucket do s3

Imagem: https://s3.amazonaws.com/superkovalev/beef.jpg'''

este é o lista.xhtml no campo de exibir a foto

<h:column>
            <f:facet name="header">Imagem</f:facet>
                <h:outputLink value="#{request.contextPath}
                                 /#{book.summaryPath}">
                                  #{book.summaryPath}
                                         </h:outputLink>
     </h:column>

este é o filesaver (só troquei pelas credenciais corretas):

public class FileSaver {
...
public String write(String baseFolder,
Part multipartFile) {
AmazonS3Client s3 = client();
String fileName = extractFilename(multipartFile
.getHeader(CONTENT_DISPOSITION));
try {
s3.putObject("casadocodigo", fileName,
multipartFile.getInputStream(),
new ObjectMetadata());
return "https://s3.amazonaws.com/casadocodigo/"
+fileName;
} catch (AmazonClientException | IOException e) {
throw new RuntimeException(e);
}
}
private AmazonS3Client client() {
AWSCredentials credentials = new BasicAWSCredentials(
"AKIAIOSFODNN7EXAMPLE",
"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY");
AmazonS3Client newClient =
new AmazonS3Client(credentials,
new ClientConfiguration());
newClient.setS3ClientOptions(new S3ClientOptions()
.withPathStyleAccess(true));
return newClient;
}

este é o adminbooksbean

@Model
public class AdminBooksBean {

    private Book product = new Book();
    @Inject
    private BookDAO productDAO;
    private List<String> selectedAuthorsIds = new ArrayList<>();
    @Inject
    private MessagesHelper messagesHelper;
    private Part summary;
    @Inject
    private FileSaver fileSaver;

    public void setSummary(Part summary) {
        this.summary = summary;
    }

    public Part getSummary() {
        return summary;
    }

    @Transactional
    public String save(){
        populateBookAuthor();        
        String coverPath = fileSaver.write("summaries", summary);

        product.setSummaryPath(summaryPath);        
        productDAO.save(product);

        messagesHelper.addFlash(new FacesMessage("Livro gravado com sucesso"));
        return "/livros/list?faces-redirect=true";
    }

    private void populateBookAuthor() {
        selectedAuthorsIds.stream().map( (strId) -> {
            return new Author(Integer.parseInt(strId));
        }).forEach(product :: add);
    }

    public void setSelectedAuthorsIds(List<String> selectedAuthorsIds) {
        this.selectedAuthorsIds = selectedAuthorsIds;
    }

    public List<String> getSelectedAuthorsIds() {
        return selectedAuthorsIds;
    }

    public Book getProduct() {
        return product;
    }

}

classe Book na parte do getter e setter summary

private String summaryPath;

    public String getSummaryPath() {
        return summaryPath;
    }

    public void setSummaryPath(String summaryPath) {
        this.summaryPath = summaryPath;
    }
14 respostas

Fala Sergio, tranquilo?

Você está dando permissão de acesso ao arquivo?

Oi Daniel tudo bom? Eu camelei um pouquinho até entender como dar permissões, mas consegui e passei a gravar as fotos no bucket. As permissões que tenho lá são essas: List objects = yes Write objects = yes Read bucket permissions = yes Write bucket permissions = yes

O problema agora é que as fotos são gravadas no S3 e o caminho no BD está com um endereço https://s3.amazonaws.com/superkovalev/beef.jpg''' que também é o endereço que está no bucket do S3, mas a imagem não é exibida no campo imagem do formulário, ao contrário é exibido esse mesmo link e se clicar nele o retorno é 404 - Not Found.

Você pode me ajudar a entender o que está errado? Obrigado!

Está parecendo bem que é questão de permissão, não consigo abrir o link aqui pra exibir a imagem. Pelo que você falou, deve estar faltando a permissão de leitura de arquivo.

Oi Daniel, pois é.. dentro do bucket que eu criei existe a aba permissions onde tudo o que pode ser concedido (existem 4 opções) já está setado (List objects = yes Write objects = yes Read bucket permissions = yes Write bucket permissions = yes) Tentei agora também tornar public a view da foto mas não funcionou. você poderia me dizer onde fica essa permissão de leitura de arquivo para que eu possa alterar? Obrigado

Clicando no seu arquivo vai ser exibida uma tela de overview, nessa tela vai ter uma opção chamada "Make public".

Oi Daniel fiz isso, tornei publica todas as fotos, restartei o servidor e continua a aparecer os links e não as fotos e quando clico no link aparece 404 - Not Found mas o link que abre é este: http://localhost:8080/casadocodigo%20/https://s3.amazonaws.com/superkovalev/beef.jpg

Se eu uso este link que está no bucket faço download da foto: https://s3.amazonaws.com/superkovalev/beef.jpg

Acho que o link que está gravado no BD é localhost apesar de estar escrito sem o http://localhost. Você saberia me dizer onde é a parte do código que traz o link para a foto? Deve ser aí o problema, não será??

Segue o link da minha pagina lista.xhtml para vc observar como está aparecendo: https://drive.google.com/open?id=12Mt7LS7Iqb0k7O8caLVOcEdcxrURRrCE

Putz tá mais complicado que parece.

Oi Sergio, agora já consegui abrir a imagem aqui, já é um bom começo.

Se você tentar alterar o trecho do seu lista.xhtml de:

<h:outputLink value="#{request.contextPath}
                                 /#{book.summaryPath}">

para

<h:outputLink value="#{book.summaryPath}">

Para qual link você passa a ser redirecionado?

Oi Daniel alterei como sugeriu mas continua não mostrando a foto mas ao invés de me direcionar para outra página e mostrar o codigo 404 - Not Found, agora pelo menos está tentando fazer o download e abrir a foto no editor de foto do Windows. Ah entendi ele não lê mais como http://localhost, agora ele lê o link correto por isso não faz mais o 404 - Not Found estamos perto mas ainda não mostra a foto.

    <h:column>
            <f:facet name="header">Imagem</f:facet>
                    <h:outputLink value="#{book.summaryPath}">
                            #{book.summaryPath}
                    </h:outputLink>
    </h:column>

Opa, tenta usar o:

<h:graphicImage value="link-da-imagem" />

Oi Daniel quando coloco o link da imagem aparece a imagem.

 <h:column>
                <f:facet name="header">Imagem</f:facet>
                <h:graphicImage value="https://s3.amazonaws.com/superkovalev/nivea.jpg"/>

          </h:column>

Puxa agora sim a imagem apareceu, mas como faço para selecionar a imagem correta referente ao id do produto?

solução!

Daniel, consegui fazer funcionar mas não sei como. Copiei o adminbooksbean do commit no github e funcionou. Mas não sei onde está o erro, e também gostaria de saber porque eu tenho que deixar as fotos como pública? A Amazon sugere que as fotos não sejam deixadas públicas, haveria aí algum problema de segurança ou não? Obrigado

Oi Sergio, ainda bem que conseguiu.

Se elas não estiverem públicas ninguém conseguirá acessar o seu conteúdo, e ficaremos caindo na situação de permissão negada do início do seu problema.

Muito obrigado pela sua ajuda Daniel.

abraços

Disponha, qualquer coisa estamos por aqui para ajudar ;)