http://javatipseveryday.com - A Brand New Course that Helps You Turn Yourself into a Java Expert Within One Year!
- Java EE 6 with Servlet 3.0.
- Server: Apache Tomcat 7.0
1. File Upload API in Servlet 3.0
The Servlet 3.0 API provides some new APIs for working with upload data:- Annotation MultipartConfig: A servlet can be annotated with this annotation in order to handlemultipart/form-data requests which contain file upload data. The MultipartConfig annotation has the following options:
- fileSizeThreshold: file’s size that is greater than this threshold will be directly written to disk, instead of saving in memory.
- location: directory where file will be stored via Part.write() method.
- maxFileSize: maximum size for a single upload file.
- maxRequestSize:maximum size for a request.All sizes are measured in bytes.
- Interface Part: represents a part in a multipart/form-data request. This interface defines some methods for working with upload data (to name a few):
- getInputStream(): returns an InputStream object which can be used to read content of the part.
- getSize(): returns the size of upload data, in bytes.
- write(String filename): this is the convenience method to save upload data to file on disk. The file is created relative to the location specified in the MultipartConfig annotation.
- New methods introduced in HttpServletRequest interface:
- getParts(): returns a collection of Part objects
- getPart(String name): retrieves an individual Part object with a given name.
- Annotation MultipartConfig: A servlet can be annotated with this annotation in order to handlemultipart/form-data requests which contain file upload data. The MultipartConfig annotation has the following options:
1
2
3
4
| for (Part part : request.getParts()) { String fileName = extractFileName(part); part.write(fileName); } |
1
2
3
4
5
6
7
8
9
10
| private String extractFileName(Part part) { String contentDisp = part.getHeader( "content-disposition" ); String[] items = contentDisp.split( ";" ); for (String s : items) { if (s.trim().startsWith( "filename" )) { return s.substring(s.indexOf( "=" ) + 2 , s.length()- 1 ); } } return "" ; } |
form-data; name="dataFile"; filename="PHOTO.JPG"
So the extractFileName() method gets PHOTO.JPG out of the string.2. Coding file upload servlet class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| package net.codejava.servlet; import java.io.File; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet ( "/UploadServlet" ) @MultipartConfig (fileSizeThreshold= 1024 * 1024 * 2 , // 2MB maxFileSize= 1024 * 1024 * 10 , // 10MB maxRequestSize= 1024 * 1024 * 50 ) // 50MB public class UploadServlet extends HttpServlet { /** * Name of the directory where uploaded files will be saved, relative to * the web application directory. */ private static final String SAVE_DIR = "uploadFiles" ; /** * handles file upload */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // gets absolute path of the web application String appPath = request.getServletContext().getRealPath( "" ); // constructs path of the directory to save uploaded file String savePath = appPath + File.separator + SAVE_DIR; // creates the save directory if it does not exists File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } for (Part part : request.getParts()) { String fileName = extractFileName(part); part.write(savePath + File.separator + fileName); } request.setAttribute( "message" , "Upload has been done successfully!" ); getServletContext().getRequestDispatcher( "/message.jsp" ).forward( request, response); } /** * Extracts file name from HTTP header content-disposition */ private String extractFileName(Part part) { String contentDisp = part.getHeader( "content-disposition" ); String[] items = contentDisp.split( ";" ); for (String s : items) { if (s.trim().startsWith( "filename" )) { return s.substring(s.indexOf( "=" ) + 2 , s.length()- 1 ); } } return "" ; } } |
Learn how to create dynamic websites using the Java programming language with this video tutorial: Servlets and JSPs: Creating Web Applications With Java
3. Coding JSP upload form
Following is source code the upload.jsp file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1" > < title >File Upload</ title > </ head > < body > < center > < h1 >File Upload</ h1 > < form method = "post" action = "UploadServlet" enctype = "multipart/form-data" > Select file to upload: < input type = "file" name = "file" size = "60" />< br /> < br /> < input type = "submit" value = "Upload" /> </ form > </ center > </ body > </ html > |
4. Coding JSP result page
Following is source code the result page (message.jsp):
1
2
3
4
5
6
7
8
9
10
11
12
13
| <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1" > < title >Upload</ title > </ head > < body > < h2 >${requestScope.message}</ h2 > </ body > </ html > |
5. Deploying and testing the application
Deploy the UploadServlet30.war file on a Tomcat version that supports Servlet 3.0 API (e.g. Tomcat 7.0). Type the following URL into browser’s address bar:
http://localhost:8080/UploadServlet30/upload.jsp
The upload form appears:
Click on Choose File button (Chrome) or Browse (FireFox/IE) to pick up a file, and hit Upload. After the file is uploaded to the server, a successful message appears:
The file is stored under:
$TOMCAT_HOME\webapps\UploadServlet30\uploadFiles
You can download an Eclipse project or a deployable WAR file in the attachment section.
댓글 없음:
댓글 쓰기