Exibindo imagens com um Servlet

2 respostas
knik

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...

2 Respostas

sammers21

kra o problema é q no linux a estrutura de arquivos e totalmente diferente com a do windows, sem contar que o posicionamento das barras e ao contrario.

R

tira as barras e tenta

File.separetor();
Criado 20 de dezembro de 2007
Ultima resposta 29 de out. de 2010
Respostas 2
Participantes 3