Bom dia amigos do GUJ.
Recentemente estava com um problema para exibir imagens que estavam armazenadas no servidor mas que estavam fora do contexto da aplicação WEB
Mas detalhes sobre o problema que estava passando acesse este tópico
http://www.guj.com.br/posts/list/88504.java
Quero compartilhar com vocês a solução que encontrei, acredito que muitos procuram essa solução.
Encontrei neste site a solução: http://balusc.blogspot.com/2007/04/imageservlet.html
No meu sistema existe uma tabela chamada PRODUTO onde estão armazenadas as características do produto. como nome, gramatura, tamanho preço e o caminho das fotos do produtos que serão usadas pelo sistema para carregas as fotos. Em uma outra tabela chamada ESTOQUE são cadastrada os a quantidade de estoque do produto pois cada produto pode ter diversas cores. e o a referência dessas cores e armazena da seguinte forma:
COR: 1012 - C, 5017 - C etc…
As imagens são gravadas com os nomes da seguinte forma 1012C.jpg, 5017.jpg
Na minha classe Estoque possui um método chamado getCaminhoFotoProduto()
que monta o caminho da foto do produto. Eu tinha que exibir a foto retornando pelo caminho retornado pelo método. Ao retornar os produtos consultados exibo os produtos em dataTable e a foto no componente graphicImage.
Mas detalhes sobre o problema que estava passando acesse este tópico
http://www.guj.com.br/posts/list/88504.java
Usando a dica do site http://balusc.blogspot.com/2007/04/imageservlet.html
Defini minha coluna que exibe a mensagem da seguinte forma:
<h:column rendered="true" id ="imgProduto">
<f:facet name="header" >
<h:outputText style="font-weight: bold;" value=""/>
</f:facet>
<h:graphicImage height="80" width="80"
value="image?file=#{item.caminhoFotoProduto}"
alt="Foto não exibida"
id="imgProduto1" />
</h:column>
Meu servlet
import java.io.*;
import java.net.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* Este Servlet carrega um aimagem armazenada no hd
* @author PAULO
*/
public class LoadImageHDServlet extends HttpServlet {
//Defino aqui o diretorio base das fotos
String imageFilePath = "C:\\Fotos";
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Get file name from reques
//Capturando o caminho do arquivo atraves do request
String imageFileName = request.getParameter("file");
/*Como meu método getCaminhoFotoProduto retorna o caminho completo
* uso p método substring para copiar somente o diretório depois de
* C:\\Fotos ou seja se o caminho retornando foi C:\\Fotos\\PV\\1012C.jpg
* o método substring so vai copiar \\PV\\1012C.jpg
*/
imageFileName = imageFileName.substring(10);
if (imageFileName != null) {
imageFileName = imageFileName.replaceAll("\\.+(\\\\|/)", "");
// Decode the file name and prepare file object.
imageFileName = URLDecoder.decode(imageFileName, "UTF-16");
// Get content type by filename.
String contentType = URLConnection.guessContentTypeFromName(imageFileName);
File file = new File(imageFilePath, imageFileName);
// Preparando os streams
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
// Abrindo a imagem
input = new BufferedInputStream(new FileInputStream(file));
int contentLength = input.available();
// Init servlet response.
response.reset();
response.setContentLength(contentLength);
response.setContentType(contentType);
response.setHeader(
"Content-disposition", "inline; filename=\"" + imageFileName + "\"");
output = new BufferedOutputStream(response.getOutputStream());
// Write file contents to response.
while (contentLength-- > 0) {
output.write(input.read());
}
//Finalizando
output.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
//Finalizando os streams
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
// <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 {
processRequest(request, response);
}
/**
* 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 {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
Mapeamento no arquivo WEB.xml
<servlet-mapping>
<servlet-name>LoadImageHDServlet</servlet-name>
<url-pattern>/image/*</url-pattern>
</servlet-mapping>
Espero ter ajudo vocês