…Continuando nosso artigo como Trabalhar com fotos em Java
Vamos criar nossa classe de manipulação de imagens, mas antes é necessário saber que, quando o nosso usuário for acessar nossa aplicação, e inserir uma imagem no banco de dados, internamente o sistema executará um servlet, que será responsável por fazer um upload dessa imagem para o nosso servidor de aplicação.
Para realização do Upload, usaremos o componente <ice:inputFile>, do framewok IceFaces e para isso devemos configurar um ManagedBean em nosso arquivo de contexto faces-config.xml, da seguinte maneira:
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>uploadMB</managed-bean-name>
<managed-bean-class>com.ManageBean.UploadMB</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
Caso não tenha o framework instalado acesse: http://www.icefaces.org/main/downloads/
UPLOAD
Nossa página de visualização de upload(a que o usuário estará vendo ao desejar inserir uma imagem no servidor), será assim:
<f:view>
<html>
<head>
<title>Inserindo foto</title>
</head>
<body>
<center>
<ice:form id="form1">
<ice:panelGrid>
<font face="Arial" color="Black">
<ice:outputText value="Clique *Procurar* para encontrar a foto desejada e depois *Enviar* " />
</font>
<br/>
<ice:inputFile id="inputFileComponent" file="#{uploadMB.arquivo}" uniqueFolder="false" label="Enviar"
action="#{uploadMB.gravarImagem}"
/>
<br/>
<ice:message for="inputFileComponent"/> <br/>
<font color="red" face="Arial" style="bold">
<ice:outputText value="#{uploadMB.caminho}" />
</font>
</ice:panelGrid>
</ice:form>
<ice:form id="form2">
<ice:panelGroup styleClass="componentBox"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ice="http://www.icesoft.com/icefaces/component">
<!-- display of all connnection status icons for -->
<ice:panelGroup styleClass="exampleBox centerBox outputConnectionStatus" >
</ice:panelGroup>
</ice:panelGroup>
</ice:form>
</center>
</body>
</html>
</f:view>
Quanto a classe de upload, implementada no servlet acima( upload.gravarImagem...), será descrita assim:
package com.ManageBean;
import java.io.File;
/**
*
* @author Carlos Mazzi
*/
public class UploadMB {
private Integer codBen;
private File arquivo;
private String caminho;
private boolean status;
private GravarImagem gravarImagem;
public UploadMB()
{
setStatus(false);
gravarImagem = new GravarImagem();
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public File getArquivo() {
return arquivo;
}
public void setArquivo(File arquivo) {
this.arquivo = arquivo;
caminho = arquivo.getPath()+
"...Enviado com Sucesso!";
setStatus(false);
}
public String getCaminho(){
setStatus(true);
return caminho;
}
public GravarImagem getGravarImagem() {
return gravarImagem;
}
public void setGravarImagem(GravarImagem gravarImagem) {
this.gravarImagem = gravarImagem;
}
public void gravarImagem(){
this.codBen = Uploader.auxCodigo;
this.gravarImagem.GravarImagem(this.codBen, this.arquivo);
}
DOWNLOAD
E por fim nossa Classe que recuperará uma imagem no banco de dados será assim:
package Servlets;
import java.io.*;
import java.net.*;
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* @author Carlos Mazzi
*/
public class DownloadServletBlob extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream out = response.getOutputStream();
String cod = request.getParameter("id");
String Tela = request.getParameter("Tela");
int id;
if (cod == null || cod.equals("")) {
id = 0;
} else {
id = Integer.parseInt(cod);
}
if (id == 0) {
try {
byte[] blob = new BlobManager().consultarConfSistema();
if (blob != null) {
out.write(blob);
out.flush();
out.close();
}
} finally {
out.close();
}
} else {
if (Tela == null || Tela.equals("")) {
try {
byte[] blob = new BlobManager().consultar(id);
if (blob != null) {
out.write(blob);
out.flush();
out.close();
}
} finally {
out.close();
}
} finally {
out.close();
}
}
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (SQLException ex) {
ex.printStackTrace();
}
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (SQLException ex) {
ex.printStackTrace();
} }
/**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
O fator preponderante aqui é a transição byte a byte que essa classe faz para recuperar uma imagem no banco de dados. Tanto para o armazenamento quanto para sua recuperação, ou seja, trata-se de um processo de download e upload do servidor para o cliente, vice-versa.
Pronto... agora é só apresentar para a camada do cliente em uma tela .jsp comum, segue o exemplo:
<div align="center"><img src="DownloadServletBlob?id=<%=Codigo%>" width="118" height="106"/> <br>
Onde DownloadServletBlob, trata-se da nossa classe de download(servidor->cliente) e o parâmetro código para trazer sua imagem do seu banco de dados de acordo com a sua SQL
Por enquanto ficamos por aqui
Um Abraços
Carlos Eduardo