Trabalhar com imagens externas no VRaptor

16 respostas Resolvido
jspfront-end
ewertonvd

Eu preciso carregar uma imagem no meu .jsp e esta imagem está no diretório do meu servidor, como por exemplo F:\Imagens Eu tenho esse endereço, e o nome da imagem salvos na tabela…

Eu criei a interface Diretório:

import java.net.URI;

public interface Diretorio {

    URI salva(Arquivo arquivo);

    Arquivo recupera(URI chave);
}

E criei a classe Arquivo:

public class Arquivo {

    private String caminho;
    private String nome;

    public Arquivo(String caminho, String nome) {
        this.caminho = caminho;
        this.nome = nome;
    }

    public String getCaminho() {
        return caminho;
    }

    public void setCaminho(String caminho) {
        this.caminho = caminho;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}

Como eu consigo carregar essa imagem no meu .jsp ?

16 Respostas

aix

Qual servidor você utiliza?

ewertonvd

Boa tarde aix!

IDE Eclipse, Hibernate, VRaptor4 e Maven

aix

Boa tarde @ewertonvd, o servidor?

ewertonvd

Tomcat 8.5

aix

Certo, então você usar aqueles diretórios virtuais do tomcat, tem alguns posts meus da antiga que eu explicava como fazer, mas também tem na documentação do container, o legar de usar esses repositorios viruais é que vc mapeia um diretório para algum lugar físico no seu filesystem, veja:

http://respostas.guj.com.br/36049-exibir-imagem-fora-do-diretorio-da-aplicacao--jsf-e-primefaces--

esses exemplos que encontrei são com JSF mas a idéia é a mesma com Vraptor, espero que te ajude, abração.

ewertonvd

Boa tarde aix!
Eu gostaria de implementar com base na documentação do VRaptor, mas não estou conseguindo…
Pois eu tenho dois campos na tabela produto, um para “localImagem” e outro para “imagem”, que possui o "nomeDaImagem.jpg "
Eu preciso passar para o .jsp como parâmentro o endereco+nome da imagem, para que ela seja carregada…
E para isso no VRaptor eu preciso criar um controller…
Até ai tudo bem:

package br.com.ebf.controller;

import java.io.File;

import br.com.caelum.vraptor.Controller;
import br.com.ebf.modelo.Produto;

@Controller
public class ImagemController {

	public File imgProduto(Produto produto) {
		return new File(produto.getLocalImagem() + produto.getImagem());
	}
}

Mas e depois… Como essa informação chega do .jsp ??

ewertonvd

Pessoal não estou conseguindo progredir com esse problema…
Alguém pode me explicar a infraestrutura que eu devo criar…
Ou algum exemplo…

Obrigado!!!

aix

Ola Ewertonvd,

desculpe a demora em responder mas acabei me mudando e fiquei sem net, não é permitido acessar o filesystem através do browser, ous eja: não da para montar o caminho assim, até pode, mas não é como você pensa, se fosse acesso local eu penso que dependendo do browser poderia utilizar o file:// mas não vai funcionar para a aplicação, na sua app o correto é utilizar os diretórios virtuais conforme comentei com você, ou então salva a imagem no banco, menos performático mas melhor do que ter que criar alguma bruxaria com HTML5 ou alguma velharia com Applet.

ewertonvd

Bom dia aix!
Cara agora eu estou somente com o ImagemController:

Meu ImagemController, com os print´s:

package br.com.empresa.controller;

import java.io.File;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.empresa.dao.ProdutoDao;
import br.com.empresa.modelo.Produto;

@Controller
public class ImagemController {

    @Inject
    private ProdutoDao produtoDao;

    @Get("download/{id}")
    public File imgProduto(Integer id) {

        Produto produto = produtoDao.buscaProdutoPorId(id);

        String caminho = produto.getLocalImagem() + "\\" + produto.getImagem();

        /* Trocando '/' por '\\' */
        caminho = caminho.replace("\\", "\\\\");

        /* Verificando se o caminho aponta para uma imagem */
        if (!caminho.contains(".jpg")) {
            return null;
        } else {
            File arquivo = new File(caminho);
            return arquivo;
        }
    }
}

E o link para a imagem no meu .jsp, estou testando de duas formas:

<div class="col-md-2">
	<label>Imagem do produto: </label>
	<c:if test="${produto.localImagem != null && produto.imagem != null}">
	     <img src="<c:url value="/imagem/imgProduto?caminho=${arquivo.caminho}"/>"/>
	</c:if>

        <c:if test="${produto.localImagem != null && produto.imagem != null}">
                 <img src="<c:url value="/imagem/imgProduto/${produto.id}"/>"/>
  	</c:if>
</div>

Porém em ambas as tags, gera o erro no console do browser:

GET http://localhost:8080/ebf-catalogo-mysql/imagem/imgProduto/1 404 ()
atualizaVaz:567 GET http://localhost:8080/ebf-catalogo-mysql/imagem/imgProduto?caminho= 404 ()
aix

vc criou o diretório virtual?

ewertonvd

O problema é que eu não posso criar o arquivo nomedasuaaplicação#resenhadabolafotos.xml e gravar no diretório do usuário, porque a aplicação será acessada externamente… Não só na minha rede interna…

aix

Ola @ewertonvd,

Você comentou no inicio do post que o diretório estaria no seu servidor

logo pode pode mapear, nem que seja o diretório root, crie uma estrutura ex: c:\imagens\client_one\imagem01.jpg, c:\imagens\client_two\imagem02.jpg o diretório mapeado ficaria c:\imagens com o docdir imagem, apartir dele você pode gerar várias estruturas de diretórios tanto para ler quanto para salvar, ai seu HTML vai conseguir interpretar:

ewertonvd

A principio a aplicação irá ficar na minha rede sim, mas posteriormente eu irei disponibilizá-la para fora…
Implementei com base em um e-book, não deu certo…
Alterei com a ajuda dos fóruns, mas também não estou conseguindo mostrar as imagens…
Já não estou mais entendendo a estrutura…

ewertonvd

A principio a aplicação irá ficar na minha rede sim, mas posteriormente eu irei disponibilizá-la para fora…
Implementei com base em um e-book, não deu certo…
Alterei com a ajuda dos fóruns, mas também não estou conseguindo mostrar as imagens…
Já não estou mais entendendo a estrutura…

aix

Entendo, do modo que te proponho você teria esta feature, mas concordo com vc, tem que fundamentar a ideia, o que me ajuda quando fico na frente de dúvidas é desenhar a aplicação, os módulos se a mesma tem, a arquitetura estrutural do projeto, assim já mapeamos vários problemas que poderiam ocorrer no desenvolvimento.

ewertonvd
Solucao aceita

Resolvido…

Obrigado pela ajuda aix! Um abraço!

Criado 1 de fevereiro de 2017
Ultima resposta 20 de fev. de 2017
Respostas 16
Participantes 2