1

I am trying to display an image stored on local disk without success.

In my index.xhtml I have:

<h:graphicImage id="image" value="#{tableData.imageTitle}" /> 

I have created a new servlet following the tutorial

My web.xml:

<!-- JSF mapping --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <!-- Image Mapping --> <servlet> <servlet-name>imageServlet</servlet-name> <servlet-class>package.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>imageServlet</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> 

As I was saying, the image is not found (my images are stored "C:\Documents and Settings\user\images").

Any feedback is strongly appreciated. Thank you!

UPDATE:

I am using embedded Jetty and JSF 2.0.

My ImageServlet looks like this (i modified a little the ImageServlet from the tutorial) :

/* * The Image servlet for serving from absolute path. */ 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:\\Documents and Settings\\user\\images"; //this.imagePath = PlatformConfig.getProperty("LocalOperation.Images.Path", null); System.out.println("imagePath = " + imagePath); // 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(); System.out.println("requestedImage = " + requestedImage); // 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. System.out.println(imagePath); 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() + "\""); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. response.setHeader("Pragma", "no-cache"); // HTTP 1.0. response.setDateHeader("Expires", 0); // Proxies. // 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(); } } } } 

My bean looks like this:

@ManagedBean @SessionScoped public class TableData { private String imageTitle = "Image_ON.png"; public String getImageTitle(){ return imageTitle; } } 

I don't understand why the image is not found.

1
  • I think the best solution is to put an apache to server static files. But post your code. Commented Jul 9, 2012 at 12:16

2 Answers 2

2

You've mapped the servlet on a suffix pattern *.png instead of a prefix pattern like /image/* as in the tutorial which you found yourself. This way the request.getPathInfo() will always return null. You need request.getServletPath() instead.

Sign up to request clarification or add additional context in comments.

Comments

0

I think you should try using Virtual directory. It's very straight-forward without having to create any kind of servlets, etc.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.