Trabalhar com imagens externas no VRaptor

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 ?

Qual servidor você utiliza?

Boa tarde aix!

IDE Eclipse, Hibernate, VRaptor4 e Maven

Boa tarde @ewertonvd, o servidor?

Tomcat 8.5

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.

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 ??

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

Obrigado!!!

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.

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 ()

vc criou o diretório virtual?

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…

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:

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…

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…

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.

Resolvido…

Obrigado pela ajuda aix! Um abraço!