Enterprise Java

File Upload Example in Servlet and JSP

Uploading File to server using Servlet and JSP is a common task in Java web application. Before coding your Servlet or JSP to handle file upload request, you need to know little bit about File upload support in HTML and HTTP protocol. If you want your user to choose files from file system and upload to server than you need to use <input type=”file”/>. This will enable to choose any file form file system and upload to server. Next thing is that form method should be HTTP POST with enctype as multipart/form-data, which makes file data available in parts inside request body. Now in order to read those file parts and create a File inside Servlet can be done by using ServletOutputStream. It’s better to use Apache commons FileUpload, an open source library. Apache FileUpload handles all low details of parsing HTTP request which confirm to RFC 1867 or “Form based File upload in HTML”, when you set form method post and content type as “multipart/form-data”.

Important points:

JavaSparrow-med

  1. DiskFileItemFactory is default Factory class for FileItem. When Apache commons read multipart content and generates FileItem, this implementation keep file content either in memory or in disk as temporary file, depending upon threshold size. By default DiskFileItemFactory has threshold size of 10KB and generates temporary files in temp directory, returned by System.getProperty(“java.io.tmpdir”). Both of these values are configurable and it’s best to configure these for production usage. You may get permission issues if user account used for running Server doesn’t have sufficient permission to write files into temp directory.
  2. Choose threshold size carefully based upon memory usage, keeping large content in memory may result in java.lang.OutOfMemory, while having too small values may result in lot’s of temporary files.
  3. Apache commons file upload also provides FileCleaningTracker to delete temporary files created by DiskFileItemFactory. FileCleaningTracker deletes temporary files as soon as corresponding File instance is garbage collected. It accomplish this by a cleaner thread which is created when FileCleaner is loaded. If you use this feature, than remember to terminate this Thread when your web application ends.
  4. Keep configurable details e.g. upload directory, maximum file size, threshold size etc in config files and use reasonable default values in case they are not configured.
  5. It’s good to validate size, type and other details of Files based upon your project requirement e.g. you may wants to allow  upload only images of certain size and certain types e.g. JPEG, PNG etc.

File Upload Example in Java Servlet and JSP

Here is the complete code for uploading files in Java web application using Servlet and JSP. This File Upload Example needs four files :

  1. index.jsp which contains HTML content to setup a form, which allows user to select and upload file to server.
  2. FileUploader Servlet which handles file upload request and uses Apache FileUpload library to parse multipart form data
  3. web.xml to configure servlet and JSP in Java web application.
  4. result.jsp for showing result of file upload operation.

FileUploadHandler.java

 import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet to handle File upload request from Client
 * @author Javin Paul
 */
public class FileUploadHandler extends HttpServlet {
    private final String UPLOAD_DIRECTORY = "C:/uploads";
  
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      
        //process only if its multipart content
        if(ServletFileUpload.isMultipartContent(request)){
            try {
                List<FileItem> multiparts = new ServletFileUpload(
                                         new DiskFileItemFactory()).parseRequest(request);
              
                for(FileItem item : multiparts){
                    if(!item.isFormField()){
                        String name = new File(item.getName()).getName();
                        item.write( new File(UPLOAD_DIRECTORY + File.separator + name));
                    }
                }
           
               //File uploaded successfully
               request.setAttribute("message", "File Uploaded Successfully");
            } catch (Exception ex) {
               request.setAttribute("message", "File Upload Failed due to " + ex);
            }          
         
        }else{
            request.setAttribute("message",
                                 "Sorry this Servlet only handles file upload request");
        }
    
        request.getRequestDispatcher("/result.jsp").forward(request, response);
     
    }
  
}

index.jsp

 <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>File Upload Example in JSP and Servlet - Java web application</title>
    </head>
 
    <body> 
        <div>
            <h3> Choose File to Upload in Server </h3>
            <form action="upload" method="post" enctype="multipart/form-data">
                <input type="file" name="file" />
                <input type="submit" value="upload" />
            </form>          
        </div>
      
    </body>
</html>

result.jsp

 <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>File Upload Example in JSP and Servlet - Java web application</title>
    </head>
 
    <body> 
        <div id="result">
            <h3>${requestScope["message"]}</h3>
        </div>
      
    </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

   <servlet>
        <servlet-name>FileUploadHandler</servlet-name>
        <servlet-class>FileUploadHandler</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FileUploadHandler</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
  
  
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

In summary just keep three things in mind while uploading files using Java web application

  1. Use HTML form input type as File to browse files to upload
  2. Use form method as post and enctype as multipart/form-data
  3. Use Apache commons FileUpload in Servlet to handle HTTP request with multipart data.

Dependency

In order to compile and run this Java web application in any web server e.g. Tomcat, you need to include following dependency JAR in WEB-INF lib folder.

commons-fileupload-1.2.2.jar

commons-io-2.4.jar

If you are using Maven than you can also use following dependencies :

 <dependency>
     <groupId>commons-fileupload</groupId>
     <artifactId>commons-fileupload</artifactId>
     <version>1.2.2</version>
</dependency>
<dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
     <version>2.4</version>
</dependency>

That’s all on How to upload Files using Servlet and JSP in Java web application. This File Upload example can be written using JSP, Filter or Servlet because all three are request’s entry point in Java web application. I have used Servlet for handling File upload request for simplicity. By the way from Servlet 3.0 API, Servlet is supporting multipart form data and you can use getPart() method of HttpServletRequest to handle file upload.
 

Javin Paul

I have been working in Java, FIX Tutorial and Tibco RV messaging technology from past 7 years. I am interested in writing and meeting people, reading and learning about new subjects.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

54 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Doe
Doe
11 years ago

Your index.jsp and result.jsp are identical (it is the result.jsp)

Sombat
Sombat
11 years ago
Reply to  Doe

Yes, I can not find anywhere.

GOJFileUpload Library
10 years ago
Reply to  Doe

Easiest way of file upload in java is GOJFileUpload.jar library

Here is the gojfileupload library tutorial:

http://geekonjava.blogspot.com/2014/09/upload-file-in-java-gojfileupload.html

Priya
Priya
11 years ago

Try placing this code in index.jsp –

Insert title here

Priya
Priya
11 years ago
Reply to  Priya

Sorry the HTML didnt appeared in the comment, so i m removing opening lt
head>
meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-1″>
title>Insert title here
/head>

body>
form action=”upload” method=”post” name=”uploadForm” enctype=”multipart/form-data”>
p>
input name=”uploadfile” type=”file” size=”50″>
/p>

input name=”submit” type=”submit” value=”Submit”>
/form>
/body>
/html>

Richard
Richard
11 years ago

Excelente he utilizado tu codigo y me ha funcionado..Gracias por tu gran ayuda

Richard
Richard
11 years ago

Excellent I have used your code and it works .. Thanks for your great help

jaiswal
jaiswal
10 years ago

hi I am getting the following msg

“Sorry this Servlet only handles file upload request”

can u please me?

thanks in Advance

jaiswal
jaiswal
10 years ago

very good tutorial .its working in my project

Thank you

Rakesh
Rakesh
10 years ago

but How to change upload directory path………………….c:\upload is not supported

Aaina
Aaina
7 years ago
Reply to  Rakesh

make a directory of name ‘upload’ in C drive. then it will work normally.

Dass
Dass
10 years ago

Good………..

John Mickel
John Mickel
10 years ago

awesome !! works for me :)

Namita
Namita
10 years ago

Hi,
I wants to get other two parameter values along with file type value, but when i use code as below it shows null values for other parameters. Plz help…

Enter Name:
Enter Password :
Select Image :

Pon siva
Pon siva
10 years ago
Reply to  Namita
sachin
sachin
10 years ago

HTTP Status 404 – /fileuploding/upload

type Status report

message /fileuploding/upload

description The requested resource is not available.

Brad
10 years ago
Reply to  sachin

Great tutorial.. almost there.. but getting the same error here:

HTTP Status 404 – /SimpleServlet/upload

type Status report

message /SimpleServlet/upload

description The requested resource is not available.

Apache Tomcat/7.0.53

Krithiga
Krithiga
8 years ago
Reply to  Brad

Hi, this error is because of url pattern which u have provided in web.xml and it doesn’t match with your name value pair in index.html or jsp. So check the code above and also what you have written, then change it accordingly. It should work.

Aaina
Aaina
7 years ago
Reply to  Brad

you can use annotation
@WebServlet(name = “FileUploadHandler”, urlPatterns = {“/upload”})
in FileUploadhandler.java
it will work efficiently.

Raji
Raji
10 years ago

I want updating image in server and local database using jsp and servlet

Nitish
Nitish
10 years ago

when i m using above code to upload file getting error..

package does not exist.

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

pls provide solution.

Namita
Namita
10 years ago
Reply to  Nitish

commons-fileupload-1.2.2.jar
commons-io-2.4.jar
Download above two jars and add them to your project, then build path if working in eclipse else add jars from properties in netbeans

viraj
viraj
10 years ago

What happens if I have some other fields in my form such as name, address etc..?
in that case, is there any way to get the photo as request.getParameter(“name”)?

Dharmendra
Dharmendra
10 years ago

it’s really very nice code.
Thanx alot..

sristi
sristi
9 years ago
Reply to  Dharmendra

did your code run? i am getting error 404 error FileUploadHandler not found.

Roshan
Roshan
8 years ago
Reply to  sristi

Hi Sristi

Did you receive any answer for this? I am getting the same error. Please let me know what you had done that time.

Aaina
Aaina
7 years ago
Reply to  Roshan

you can use annotation
@WebServlet(name = “FileUploadHandler”, urlPatterns = {“/upload”})
in FileUploadhandler.java
it will work efficiently.

vijay rajgor
vijay rajgor
9 years ago

Sir thanks for this beautiful code.
It works perfectly.
Thanks.

Tapaswi Gadre
Tapaswi Gadre
9 years ago

Sir i am getting error at time of redirecting from index.jsp and error is like as below…

type Status report

message /EZaroka/build/upload

description The requested resource is not available.

here my programs path is webapps/EZaroka/build/index.jsp
plz help me.

Alloysis Tufani
Alloysis Tufani
9 years ago
Reply to  Tapaswi Gadre

Configure web.xml properly and follow the directory structure of the server you are using

kavi
kavi
9 years ago

thanks for the nice article

Sarah Books
Sarah Books
9 years ago

The code runs and tells me it successfully uploaded the file but where does it upload the file to? I can’t find it anywhere.

Radhe Shyam
Radhe Shyam
9 years ago
Reply to  Sarah Books

Set following statement in “FileUploadHandler.java” file

private final String UPLOAD_DIRECTORY = “F:/uploads”;

First create uploads folder in F: drive then, It saves your uploaded file in “uploads” folder of F: drive

Sarah
Sarah
9 years ago
Reply to  Radhe Shyam

Thanks Radhe!

spoorthi
spoorthi
9 years ago

can anyone please explain me form tag what is the action referring to? I’m getting http status not found error how should I configure my web.xml? Please let me know as soon as possible thank you.

Back to top button