Servlet 文件上传
Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。
创建一个文件上传表单
下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意:
- 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。
- 表单 enctype 属性应该设置为 multipart/form-data.
- 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 UploadServlet Servlet 来上传文件。
- 上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
<html> <head> <title>文件上传表单</title> </head> <body> <h3>文件上传:</h3> 请选择要上传的文件:<br /> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="上传文件" /> </form> </body> </html>
编写后台 Servlet
以下是 Servlet UploadServlet,会接受上传的文件,并把它储存在目录 <Tomcat-installation-directory>/webapps/data 中。这个目录名也可以使用外部配置来添加,比如 web.xml 中的 context-param 元素,如下所示:
<web-app> .... <context-param> <description>Location to store uploaded file</description> <param-name>file-upload</param-name> <param-value> c:\apache-tomcat-5.5.29\webapps\data\ </param-value> </context-param> .... </web-app>
以下是 UploadServlet 的源代码,可以一次处理多个文件的上传。在继续操作之前,请确认下列各项:
- 下面的实例依赖于 FileUpload,所以一定要确保在您的 classpath 中有最新版本的 commons-fileupload.x.x.jar 文件。可以从 http://commons.apache.org/fileupload/ 下载。
- FileUpload 依赖于 Commons IO,所以一定要确保在您的 classpath 中有最新版本的 commons-io-x.x.jar 文件。可以从 http://commons.apache.org/io/ 下载。
- 在测试下面实例时,您上传的文件大小不能大于 maxFileSize,否则文件将无法上传。
- 请确保已经提前创建好目录 c:\temp and c:\apache-tomcat-5.5.29\webapps\data。
1 // 导入必需的 java 库 2 import java.io.*; 3 import java.util.*; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import org.apache.commons.fileupload.FileItem; 12 import org.apache.commons.fileupload.FileUploadException; 13 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 14 import org.apache.commons.fileupload.servlet.ServletFileUpload; 15 import org.apache.commons.io.output.*; 16 17 public class UploadServlet extends HttpServlet { 18 19 private boolean isMultipart; 20 private String filePath; 21 private int maxFileSize = 50 * 1024; 22 private int maxMemSize = 4 * 1024; 23 private File file ; 24 25 public void init( ){ 26 // 获取文件将被存储的位置 27 filePath = 28 getServletContext().getInitParameter("file-upload"); 29 } 30 public void doPost(HttpServletRequest request, 31 HttpServletResponse response) 32 throws ServletException, java.io.IOException { 33 // 检查我们有一个文件上传请求 34 isMultipart = ServletFileUpload.isMultipartContent(request); 35 response.setContentType("text/html"); 36 java.io.PrintWriter out = response.getWriter( ); 37 if( !isMultipart ){ 38 out.println("<html>"); 39 out.println("<head>"); 40 out.println("<title>Servlet upload</title>"); 41 out.println("</head>"); 42 out.println("<body>"); 43 out.println("<p>No file uploaded</p>"); 44 out.println("</body>"); 45 out.println("</html>"); 46 return; 47 } 48 DiskFileItemFactory factory = new DiskFileItemFactory(); 49 // 文件大小的最大值将被存储在内存中 50 factory.setSizeThreshold(maxMemSize); 51 // Location to save data that is larger than maxMemSize. 52 factory.setRepository(new File("c:\\temp")); 53 54 // 创建一个新的文件上传处理程序 55 ServletFileUpload upload = new ServletFileUpload(factory); 56 // 允许上传的文件大小的最大值 57 upload.setSizeMax( maxFileSize ); 58 59 try{ 60 // 解析请求,获取文件项 61 List fileItems = upload.parseRequest(request); 62 63 // 处理上传的文件项 64 Iterator i = fileItems.iterator(); 65 66 out.println("<html>"); 67 out.println("<head>"); 68 out.println("<title>Servlet upload</title>"); 69 out.println("</head>"); 70 out.println("<body>"); 71 while ( i.hasNext () ) 72 { 73 FileItem fi = (FileItem)i.next(); 74 if ( !fi.isFormField () ) 75 { 76 // 获取上传文件的参数 77 String fieldName = fi.getFieldName(); 78 String fileName = fi.getName(); 79 String contentType = fi.getContentType(); 80 boolean isInMemory = fi.isInMemory(); 81 long sizeInBytes = fi.getSize(); 82 // 写入文件 83 if( fileName.lastIndexOf("\\") >= 0 ){ 84 file = new File( filePath + 85 fileName.substring( fileName.lastIndexOf("\\"))) ; 86 }else{ 87 file = new File( filePath + 88 fileName.substring(fileName.lastIndexOf("\\")+1)) ; 89 } 90 fi.write( file ) ; 91 out.println("Uploaded Filename: " + fileName + "<br>"); 92 } 93 } 94 out.println("</body>"); 95 out.println("</html>"); 96 }catch(Exception ex) { 97 System.out.println(ex); 98 } 99 } 100 public void doGet(HttpServletRequest request, 101 HttpServletResponse response) 102 throws ServletException, java.io.IOException { 103 104 throw new ServletException("GET method used with " + 105 getClass( ).getName( )+": POST method required."); 106 } 107 }
编译和运行 Servlet
编译上面的 Servlet UploadServlet,并在 web.xml 文件中创建所需的条目,如下所示:
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping>
现在尝试使用您在上面创建的 HTML 表单来上传文件。当您在浏览器中访问:http://localhost:8080/UploadFile.htm 时,如果您的 Servelt 脚本能正常工作,那么您的文件会被上传到 c:\apache-tomcat-5.5.29\webapps\data\ 目录中。
本文转载自:http://www.runoob.com/servlet/servlet-file-uploading.html