Servlet Imagem fora do contexto

5 respostas
F

Pessoal boa tarde,

Estou com um problema, pesquisei em vários lugares diferentes mas não consegui resolver meu problema.
O problema é o seguinte, eu tenho uma pagina XHTML e ao chama-la eu quero que carregue uma imagem que está em c:\Contratos.

Eu fiz o Seguinte

Arquivo WEB.xml

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>br.com.stefanini.sgi.servlet.ImageServlet</servlet-class>
    <load-on-startup>1</load-on-startup> 
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/image/*</url-pattern>
</servlet-mapping>

Servlet ImageServlet

package br.com.stefanini.sgi.servlet;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * The Image servlet for serving from absolute path.
 * 
 * @author BalusC
 * @link http://balusc.blogspot.com/2007/04/imageservlet.html
 */

public class ImageServlet extends HttpServlet {

	// Constants
	// ----------------------------------------------------------------------------------

	private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.

	// Properties
	// ---------------------------------------------------------------------------------

	private String imagePath;

	// Actions
	// ------------------------------------------------------------------------------------

	public void init() throws ServletException {

		// Define base path somehow. You can define it as init-param of the
		// servlet.
		this.imagePath = "c:/Contratos";

		// In a Windows environment with the Applicationserver running on the
		// c: volume, the above path is exactly the same as "c:\images".
		// In UNIX, it is just straightforward "/images".
		// If you have stored files in the WebContent of a WAR, for example in
		// the
		// "/WEB-INF/images" folder, then you can retrieve the absolute path by:
		// this.imagePath = getServletContext().getRealPath("/WEB-INF/images");
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// Get requested image by path info.
		String requestedImage = request.getPathInfo();

		// Check if file name is actually supplied to the request URI.
		if (requestedImage == null) {
			// Do your thing if the image is not supplied to the request URI.
			// Throw an exception, or send 404, or show default/warning image,
			// or just ignore it.
			response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
			return;
		}

		// Decode the file name (might contain spaces and on) and prepare file
		// object.
		File image = new File(imagePath, URLDecoder.decode(requestedImage,
				"UTF-8"));

		// Check if file actually exists in filesystem.
		if (!image.exists()) {
			// Do your thing if the file appears to be non-existing.
			// Throw an exception, or send 404, or show default/warning image,
			// or just ignore it.
			response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
			return;
		}

		// Get content type by filename.
		String contentType = getServletContext().getMimeType(image.getName());

		// Check if file is actually an image (avoid download of other files by
		// hackers!).
		// For all content types, see:
		// http://www.w3schools.com/media/media_mimeref.asp
		if (contentType == null || !contentType.startsWith("image")) {
			// Do your thing if the file appears not being a real image.
			// Throw an exception, or send 404, or show default/warning image,
			// or just ignore it.
			response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
			return;
		}

		// Init servlet response.
		response.reset();
		response.setBufferSize(DEFAULT_BUFFER_SIZE);
		response.setContentType(contentType);
		response.setHeader("Content-Length", String.valueOf(image.length()));
		response.setHeader("Content-Disposition",
				"inline; filename=\"" + image.getName() + "\"");

		// Prepare streams.
		BufferedInputStream input = null;
		BufferedOutputStream output = null;

		try {
			// Open streams.
			input = new BufferedInputStream(new FileInputStream(image),
					DEFAULT_BUFFER_SIZE);
			output = new BufferedOutputStream(response.getOutputStream(),
					DEFAULT_BUFFER_SIZE);

			// Write file contents to response.
			byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
			int length;
			while ((length = input.read(buffer)) > 0) {
				output.write(buffer, 0, length);
			}
		} finally {
			// Gently close streams.
			close(output);
			close(input);
		}
	}

	// Helpers (can be refactored to public utility class)
	// ----------------------------------------

	private static void close(Closeable resource) {
		if (resource != null) {
			try {
				resource.close();
			} catch (IOException e) {
				// Do your thing with the exception. Print it, log it or mail
				// it.
				e.printStackTrace();
			}
		}
	}
}

e minha página que está em “WebContent/restrito/fornecedor”

Pagina xhtml “fornecedor_consulta.xhtml”

<p:column style="text-align:center;">
						<f:facet name="header">
							#{msg.coluna_contrato}
						</f:facet>
							 <h:graphicImage value="image/pesquisar.png" />
							 <img src="image/pesquisar.png" />
					</p:column>

Eu achei essa forma em vários lugares de configuração, porém ao carregar minha página ele não exibe a imagem.
Como eu faço para que essa página chame a minha Servlet e carregue a imagem?

Obrigado pela ajuda

5 Respostas

H

No comando <h:graphicImage value=“image/pesquisar.png” /> você tem que apontar para o servlet.

F

Como assim apontar para o Servlet, tem como colocar um exemplo??

Obrigado.

H

Como assim apontar para o Servlet, tem como colocar um exemplo??

Obrigado.seria tipo /MeuProjeto/servlet.jsp?imagem=“pesquisar”

Seria algo do tipo, não sei te falar de cabeça, de onde você copiou esse código ele não mostra não?

F

Como assim apontar para o Servlet, tem como colocar um exemplo??

Obrigado.seria tipo /MeuProjeto/servlet.jsp?imagem=“pesquisar”

Seria algo do tipo, não sei te falar de cabeça, de onde você copiou esse código ele não mostra não?

Ele não mostra to apanhando feio para isso.

Mas eu entendi mais ou menos o que você quis dizer.

Quando eu acesso a minha pagina fornecedor_consulta.xhtml
Na url da minha aplicação fica o seguinte - “http://localhost:8080/SGI/restrito/principal.jsf
Fica assim para todas as paginas! Isso pode interferir??
Porque ele só entrou na minha Servlet quando eu mudei o mapeamento no Web.xml…

Obrigado.

F

E basta eu colocar isso no value do <h:graphicImage> ou no src do ??

Ou eu faço isso no momento em que eu chamar a minha página?

Criado 15 de maio de 2012
Ultima resposta 15 de mai. de 2012
Respostas 5
Participantes 2