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.
Este é meu primeiro post, e não tenho experiencia. Alguém poderia me ajudar?
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
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:
[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
Exemplo imagem
img{
width: 500px;
height: 350px;
}
Buscando imagens de servlet
![]()
[/code]
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
ou
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”
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.
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.