Buscar imagem em JSP e Servlet em paginas geradas pelo servidor

7 respostas
R

Olá Galera!
Estou com uma dificuldade aqui em inserir imagens nas minhas paginas. Criei uma pagina em .jsp que busca um arquivo do Navegador do cliente… e através de um Servlet salvo em um diretório ("/home/rodrigo/Uploads/imagens/imagem1.jpg") no meu computador, e no mesmo Servlet salvo o diretório no banco de dados. E sei que não ha necessidade de salvar todo diretório no banco, o resto fica em uma variável. Essas partes são bem tranquilas. Estou testando agora, em outra pagina .jsp, buscar e renderizar as imagens no navegador. O endereço no banco e no navegador estão corretos (testei colocando todo o endereço apresentador na renderização do navegador, em uma simples pagina index.html sem o servidor de aplicação, e renderizou normalmente), mas mesmo assim não busca a imagem da pagina gerada pelo servidor. Imagino que possa ser que eu tenho que referenciar esse diretório da imagem em uma URL, para mandar junto com o servidor (TomCat7 ou GlassFish 4.1). Digo isso porque quando coloco imagens na pasta da aplicação (WebContent/imagens/imagem1.jpg) funciona normalmente pelas tags do jsp . E mesmo se eu salvo utilizando os métodos file.getAbsolutePath(), não busca as imagens, e nesse caso, quando o servidor é reiniciado as imagens se perdem, mas essa não é minha dúvida.

Minha duvida é: Como posso renderizar as imagens salvas em um diretório qualquer do meu computador? Tenho que criar uma URL para a imagem? E como faz isso?
Já procurei bastante aqui no forum, google e youtube, mas nenhum resolvia o problema. E também não posso salva a imagem como Blob no banco, esta não seria uma opção. As tecnologias que estou usando são JSP, Servlet, MySQL, Hibernate, TomCat 7, commons-fileupload e commons-io. Não posso usar FrameWorks como JSF, Spring, Struts, Vraptor ou outros. Tem que ser na marra mesmo. Ficarei agradecido se puderem me ajudar.

7 Respostas

R

Este é meu primeiro post, e não tenho experiencia. Alguém poderia me ajudar?

H

Ao usar uma pasta que está fora do seu servidor, você deve gerar a imagem “na unha”.

Crie um servlet que receba um parâmetro como:
/seu_site/imagens?id=OIASUDOuIQWEUY1827368172638162

Aí você sabe que OIASUDOuIQWEUY1827368172638162 é igual a imagem:
/home/rodrigo/imagens/image33.png

Pq ñ fazer?
/seu_site/imagens?id=image33.png

Se você expor seu ID direto na URL ou até mesmo o path completo, pessoas podem começar a manipular sua URL como
/seu_site/imagens?id=image34.png ou até mesmo /seu_site/imagens?id=/home/rodrigo/codigo_fonte.java

R

Tentei gerar a imagem "na unha". Quando foi só uma imagem deu certo usando pagina jsp e o servlet, seguindo o MVC. funcionou da seguinte forma:

Pagina index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Exemplo imagem</title>
		<style type="text/css">
			img{
				width: 500px;
				height: 350px;
			}
		</style>
	</head>
	<body>
		<h1>Buscando imagens de servlet</h1>
		<img src="BuscarImagem.png" />
	</body>
</html>

Servlet BuscarImagem.java:

@WebServlet("/BuscarImagem.png")
public class BuscarImagem extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response)
    		throws ServletException, IOException {
	response.setContentType("image/png");
	String diretorio="/home/rodrigo/tomcat/Uploads/Imagens/renderbrink.png";
	File imagem2= new File(diretorio);
	BufferedImage imagem=ImageIO.read(imagem2);
	OutputStream out=response.getOutputStream();
	// Escreve a imagem no outputstream da response NO FORMATO PNG
	ImageIO.write(imagem,"PNG", out);
		if (out != null) {
			out.close();
		}
	}
}
Ai eu tentei buscar por uma lista de imagens do banco... mas acho que dessa forma não vai funcionar, pois deu erro e acho que é porque usei recursos PrintWriter out1=response.getWriter(); e OutputStream out2=response.getOutputStream(); ao mesmo tempo.
@WebServlet("/CarregarImagem")
public class CarregarImagem extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out1=response.getWriter();
		OutputStream out2=response.getOutputStream();
		
		ImagemDao imagemDao=new ImagemDao();
		List<Imagem> listaImagens=imagemDao.buscarImagem();
		out1.println("<html>"
				+ "<head>"
				+ "<title>Buscar Imagens</title>"
				+ "</head>"
				+ "<body>"
				+ "<h1>Buscar imagens a partir de um diretorio salvo no banco</h1>");
		for(Imagem imagem1:listaImagens){
			// Retornar diretorios dessa forma /home/rodrigo/tomcat/Uploads/Imagens/renderbrink.png
			String diretorio=imagem1.getDiretorios();
			File imagem2= new File(diretorio);
			BufferedImage imagem=ImageIO.read(imagem2);
			// Escreve a imagem no outputstream da response NO FORMATO PNG
			ImageIO.write(imagem,"PNG", out2);
		}
		out1.println("</body>"
				+ "</html>");
	}
}
A duvida é, Tenho que usar algo do tipo ImageIO.write(imagem,"PNG", out2)? O não teria como gerar URLs ou links automáticas, como as imagens desse tipo http://mlb-s2-p.mlstatic.com/computador-completo-core-2-duo-2gb-wifi-garantia-1-ano-217901-MLB20441454943_102015-O.jpg ? Pois aí eu colocaria
<img src="http://mlb-s2-p.mlstatic.com/computador-completo-core-2-duo-2gb-wifi-garantia-1-ano-217901-MLB20441454943_102015-O.jpg" />
ou
<a href="http://mlb-s2-p.mlstatic.com/computador-completo-core-2-duo-2gb-wifi-garantia-1-ano-217901-MLB20441454943_102015-O.jpg" >Clicar e ir para imagem do meu site</a>
H

Ao invés de escrever as imagens na página, escreva a URL e deixe que o browser a busque.

Aí vc teria uma URL que mostraria essa página:
/projeto/listaImgs

E ela retornaria algo como

... ...

Nisso o browser vai ir buscar cada imagem.

Em outras palavras: “crie 2 servlets. 1 que vai listar as imagens e outro que vá exibir a imagem”

R

Mas é ai que tá o problema. Se for só uma pagina index.html ou index.jsp, e eu abrir direto no browser com o diretório:


Funciona normalmente, pois o caminho da imagem esta correto. Mas quando é uma aplicação htttp://localhost:8080/MeuSIte/index.jsp
Esse código não funciona.


nem esse:


Pois minhas imagens estão fora do servidor. E acho que isso que eu fiz não é bem uma URL, apenas caminho local.
E se eu colocasse dentro da aplicação, /WebContent/Imagens/… Funcionaria normal, Pois estaria junto com o servidor.

R

Ai achei estes post aqui que explicam o meu problema.

http://www.guj.com.br/java/287790-tomcat-imagem-fora-do-webapps
http://www.guj.com.br/java/116905-imagens-fora-do-contexto-da-aplicao
http://www.guj.com.br/java/48587-como-exibir-uma-imagem-fora-do-contexto-da-aplicao-em-um-jsp

Agora que eu comecei entender como funciona, vou fazer aqui. E depois que conseguir, eu posto a solução explicando passo a passo.

R

Conseguir mapear imagens que estão fora da aplicação do servidor.
Esse código vai ajudar quem estiver com duvidas ao fazer uploads de imagens usando apenas jsp e servlets, e quiser
exibir suas imagens salvas em “diretórios”, no navegador.

Vamos a solução:
Crie o seguinte servlet que vai buscar as imagens em QUALQUER DIRETÓRIO;

// Esse nome será informado depois do nome do seu site
// exemplo http://localhost:8080/seu_site/imagens/nome_da_imagem.extensão
@WebServlet("/imagens/*")
public class ImagensServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	 protected void doGet(HttpServletRequest request, HttpServletResponse response)
			 throws ServletException, IOException {
		// pega o nome do arquivo
	        String nomeImagem = request.getPathInfo().substring(1);
	        // Informa todo o caminho da imagem, junto com o nome da mesma
	        // Lembrando que o diretório e o nome da imagem, poderiam vir de um banco de dados 
	        File imagem = new File("/home/meu_pc_linux/uploads/imagens", nomeImagem);
	        // Saida
	        Files.copy(imagem.toPath(), response.getOutputStream());
	 }
}

Depois é só criar sua pagina jsp que receberá o nome de QUALQUER imagem que estiver dentro da pasta.
No meu caso eu salvei na pasta imagens.

Página index.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Exibindo uma lista de imagens com JSP e Servlet</title>
	</head>
	<body>
		<style type="text/css">
			img {
				width: 200px;
			}
		</style>
		<h1>Lista de imagens</h1>
		<img src="/seu_site/imagens/imagem_1.png" />
		<img src="/seu_site/imagens/imagem_2.jpg" />
		<img src="/seu_site/imagens/imagem_3.jpg" />
		<img src="/seu_site/imagens/imagem_4.png" />
		<img src="/seu_site/imagens/imagem_5.png" />
		<img src="/seu_site/imagens/imagem_6.jpg" />
		<img src="/seu_site/imagens/imagem_7.png" />
		<img src="/seu_site/imagens/imagem_8.png" />
		<img src="/seu_site/imagens/imagem_9.jpg" />
		<img src="/seu_site/imagens/imagem_10.png" />
		<img src="/seu_site/imagens/imagem_11.jpg" />
	</body>
</html>

Depois de compilar sua aplicação, acesse o endereço
localhost:8080/seu_site/index.jsp
ou o endereço de cada imagem dentro da pasta que estão salvas
localhost:8080/seu_site/imagens/imagem_1.png
localhost:8080/seu_site/imagens/imagem_2.jpg
localhost:8080/seu_site/imagens/imagem_3.jpg
localhost:8080/seu_site/imagens/imagem_4.png
localhost:8080/seu_site/imagens/imagem_5.png
localhost:8080/seu_site/imagens/imagem_6.jpg
localhost:8080/seu_site/imagens/imagem_7.png
localhost:8080/seu_site/imagens/imagem_8.png
localhost:8080/seu_site/imagens/imagem_9.jpg
localhost:8080/seu_site/imagens/imagem_10.png
localhost:8080/seu_site/imagens/imagem_11.jpg

Bom, é uma solução simples, mas que me deu um trabalhão para conseguir fazer a primeira vez. Eu ainda não testei pegando os nomes e diretórios salvos no banco. Mas acredito que vai ajudar que estiver com duvida. Nesse meu outro poste ( http://www.guj.com.br/java/318290-criar-diretorio-virtual ), tem um solução que é gerar diretórios virtuais em uma pasta fora da aplicação, para evitar que apague os arquivos no deploy da aplicação. Mas é só se o servidor for o apache-tomcat.

Criado 3 de outubro de 2015
Ultima resposta 17 de nov. de 2015
Respostas 7
Participantes 2