Amigos,
Depois de ralar tanto consegui implementar um servlet que gera a imagem direto em uma página jsp (jspx). Ele péga esta imagem do "meu" computador (C:\imagens), faz um upload para o servidor desta imagem e a converte de TIF para JPG, exibindo o resultado que é printar na tela esta imagem.
O problema é que só funciona se o servidor for Windows, e não consegui, de jeito nenhum, fazê-lo funcionar no Linux. Alguém tem alguma idéia?
Segue abaixo o código:
jspx
<h:form id="formNovoEvento" enctype="multipart/form-data" >
<t:inputFileUpload id="myFileId"
value="#{manterEventosBean.file}"
storage="file"
size="60"
valueChangeListener="#manterEventosBean.fileTifToJpg}"
onchange="this.form.submit();"
immediate="true">
<f:selectItems value="#{manterEventosBean.file}"/>
</t:inputFileUpload>
<h:graphicImage value="#{manterEventosBean.imagemJPG}" />
</h:form>
web-xml
<servlet>
<servlet-name>Image Servlet</servlet-name>
<servlet-class>util.ImageServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Image Servlet</servlet-name>
<url-pattern>/image/*</url-pattern>
</servlet-mapping>
O Servlet (ImageServlet.java)
package util;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = -3967840643967020306L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
try {
String file = request.getParameter("file");
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
byte[] bytes = new byte[in.available()];
ServletOutputStream sos = response.getOutputStream();
try{
RenderedOp src = JAI.create("fileload", file);
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG",sos, null);
encoder.encode(src);
}catch (Exception e){
System.out.println("Diretório inválido!");
}
sos.close();
response.getOutputStream().write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
O bean
package bean;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletRequest;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import util.DetectBrowser;
import util.DetectOS;
public class ManterEventosBean {
/*
* Declaração de todos os campos que serão manipulados pelas
* páginas jspx deste caso de uso.
*/
private UploadedFile file;
private String imagemJPG;
public void fileTifToJpg(ValueChangeEvent value){
//Verifica se o UploadedFile não está nulo.
if( value.getNewValue() != null ){
file= (UploadedFile) value.getNewValue();
String pathEncontrado = file.getName();
//detecta o sistema operacional do servidor
DetectOS detectOS = new DetectOS();
boolean isWindows = detectOS.getOS();
if (isWindows){
//System.out.println("SO é windows");
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
DetectBrowser detectBrowser = new DetectBrowser();
boolean isIExplorer = detectBrowser.getBrowser(request);
if (isIExplorer) {
pathEncontrado = file.getName(); //IE
if (pathEncontrado.substring(0,11).equals("C:\\imagens\\")){
System.out.println(pathEncontrado.substring(0,11));
imagemJPG = "/image?file=" + pathEncontrado;
}else{
System.out.println(pathEncontrado);
}
}else{
pathEncontrado = "c:\\imagens\\" + file.getName();//netscape mozila e opera
imagemJPG = "/image?file=" + pathEncontrado;
}
}else{
//Se o sistema operacional do servidor for Linux...
//isto aqui eu não consegui fazer...
}
}
}
public String getImagemJPG() {
return imagemJPG;
}
public void setImagemJPG(String imagemJPG) {
this.imagemJPG = imagemJPG;
}
public UploadedFile getFile() {
return file;
}
public void setFile(UploadedFile file) {
this.file = file;
}
}
faces-config
<!-- bean -->
<managed-bean>
<managed-bean-name>manterEventosBean</managed-bean-name>
<managed-bean-class>bean.ManterEventosBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<!-- navegação -->
<navigation-rule>
<navigation-case>
<from-outcome>novoEvento</from-outcome>
<to-view-id>/pages/manterEventos/novoEvento.jspx</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
...Pois é pessoal, isto tudo acima funciona redondinho quando coloco o aplicativo para funcionar em um servidor windows. A finalidade é, ao selecionar uma imagem do cliente, o servidor processará e irá mostrar esta imagem no browser.
...Alguém tem idéia de como fazer isto também no linux, baseado no código do bean acima: detectando o SO e fazendo o que tem de fazer?
Obrigado...