user3599482 user3599482 - 5 months ago 90
HTML Question

How to display image from local path from jsp

I am trying to display an image throw jsp. Image is stored in local path so I wrote a servlet get method to retrive image and in src attribute of image tag I am giving the servlet name and image path as parameter to servlet and here is my code,

public class FileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
private String filePath;
public void init() throws ServletException {

this.filePath = "/files";
}

protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("In do get");

// Get requested file by path info.
String requestedFile = request.getPathInfo();

// Check if file is actually supplied to the request URI.
if (requestedFile == null) {
// Do your thing if the file is not supplied to the request URI.
// Throw an exception, or send 404, or show default/warning page, 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 file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));

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

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

// If content type is unknown, then set the default value.
// For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
// To add new content types, add new mime-mapping entry in web.xml.
if (contentType == null) {
contentType = "application/octet-stream";
}

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

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

try {
// Open streams.
input = new BufferedInputStream(new FileInputStream(file), 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);
}
}

protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("In do post");

}


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();
}
}
}


in web.xml the servlet entry is as follow,

<servlet>
<description>
</description>
<display-name>FileServlet</display-name>
<servlet-name>FileServlet</servlet-name>
<servlet-class>com.mypackage.FileServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>/file/*</url-pattern>
</servlet-mapping>


In Jsp I have img tag as follow,

<img alt="Image" src="file/D:/uploads/img14.jsp" width="160" height="160" class="img-thumbnail">


I think I made mistake in src attribute of img tag can anyone tell wht is the mistake I made here .

Answer

Looks like you have misunderstood BalusC's post about this: FileServlet. In this case, you will have a base path in your disk to server your files (external to the web application folder path in server), and then the path used in your URL will be used to search inside this base path. Note from BalusC's example how to call the resources:

<a href="file/foo.exe">download foo.exe</a>

Where:

  • file is the URL pattern for your Servlet. Noted in your web.xml configuration:

    <servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>/file/*</url-pattern>
    </servlet-mapping>
    
  • The rest of the URL /foo.exe is the location of the file in your server hard drive. This can be easily obtained by usage of HttpServletRequest.html#getPathInfo

This is noted by this part of the code (comments are mine):

public void init() throws ServletException {
    this.filePath = "/files";
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // Get the file path from the URL.
    String requestedFile = request.getPathInfo();

    //...
    //using filePath attribute in servletclass as the base path
    //to lookup for the files, using the requestedFile
    //path to seek for the existance of the file (by name)
    //in your server
    //decoding the name in case of GET request encoding such as
    //%2F => /
    File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));
    //...
}

Then, when having a request like this (in HTML code in your view):

<img src="files/img/myimage.png" />

You have to make sure the file exists in your server:

- /  <-- root
  - /files <-- this is the base file path set in init method in your servlet
    - /img
      - myimage.png

More info: