問題描述:
作為一個Java開發Web方向的程序員,很重要的一個功能,就是上傳文件功能是一定要掌握的,今天整理了一下代碼。
1.JSP顯示界面代碼和動態添加上傳文件個數。
1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%> 2 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>My JSP 'file_upload_test.jsp' starting page</title> 7 8 <meta http-equiv="pragma" content="no-cache"> 9 <meta http-equiv="cache-control" content="no-cache"> 10 <meta http-equiv="expires" content="0"> 11 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 12 <meta http-equiv="description" content="This is my page"> 13 <!-- 14 <link rel="stylesheet" type="text/css" href="styles.css"> 15 --> 16 <script type="text/javascript"> 17 function addline(){ 18 newline = document.all.test.insertRow(); 19 newline.insertCell().innerHTML="<input type='file' name=file_info size='60'> "+"<button onclick='javascript:removeline(this)'>移除</button>"; 20 } 21 22 function removeline(obj){ 23 var objSourceRow=obj.parentNode.parentNode; 24 var objTable=obj.parentNode.parentNode.parentNode.parentNode; 25 objTable.lastChild.removeChild(objSourceRow); 26 } 27 </script> 28 29 </head> 30 31 <body> 32 <form name="theform" method="post" action="fileUploadTest" enctype="multipart/form-data"> 33 <h4>附件上傳:</h4> 34 <table id=test border="0"> 35 <tr> 36 <td> 37 <input type="file" name="file_info" size="60"> 38 </td> 39 </tr> 40 </table> 41 <button onclick="addline();">單擊此處添加更多附件</button><hr> 42 <input type="submit" /> 43 </form> 44 </body> 45 </html>
2.Java處理請求代碼
1 package com.test; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.util.ArrayList; 7 import java.util.Iterator; 8 import java.util.List; 9 10 import javax.servlet.ServletException; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 15 import org.apache.commons.fileupload.FileItem; 16 import org.apache.commons.fileupload.FileUpload; 17 import org.apache.commons.fileupload.FileUploadException; 18 import org.apache.commons.fileupload.RequestContext; 19 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 20 import org.apache.commons.fileupload.servlet.ServletFileUpload; 21 import org.apache.commons.fileupload.servlet.ServletRequestContext; 22 23 public class FileUploadTest extends HttpServlet { 24 25 public FileUploadTest(){ 26 super(); 27 } 28 29 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 request.setCharacterEncoding("gbk"); 31 RequestContext requestContext = new ServletRequestContext(request); 32 boolean isMultipart = FileUpload.isMultipartContent(requestContext); 33 //或者boolean isMultipart = ServletFileUpload.isMultipartContent(request); 34 //PrintWriter pw = response.getWriter(); 35 if(isMultipart){ 36 DiskFileItemFactory factory = new DiskFileItemFactory(); 37 factory.setRepository(new File("C:/tmp/")); 38 ServletFileUpload upload = new ServletFileUpload(factory); 39 upload.setSizeMax(2000000); 40 List items = new ArrayList(); 41 try { 42 items = upload.parseRequest(request); 43 } catch (FileUploadException e1) { 44 System.out.println("文件上傳發生錯誤" + e1.getMessage()); 45 //pw.write("<script>alert('文件上傳發生錯誤" + e1.getMessage() + "');location.href = location.href;</script>"); 46 } 47 Iterator it = items.iterator(); 48 while(it.hasNext()){ 49 FileItem fileItem = (FileItem) it.next(); 50 if(fileItem.isFormField()){ 51 System.out.println("此次是普通文本表單字段,非文件表單字段。"); 52 }else{ 53 if(fileItem.getName() != null && fileItem.getSize() != 0){ 54 File fullFile = new File(fileItem.getName()); 55 File newFile = new File("c:/temp/" + fullFile.getName()); 56 try { 57 fileItem.write(newFile); 58 } catch (Exception e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } 62 }else{ 63 System.out.println("文件沒有選擇 或 文件內容為空"); 64 } 65 } 66 } 67 } 68 } 69 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 70 doPost(request, response); 71 } 72 }
3.Web.xml配置文件代碼
1 <servlet> 2 <servlet-name>FileUploadTest</servlet-name> 3 <servlet-class>com.test.FileUploadTest</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>FileUploadTest</servlet-name> 7 <url-pattern>/fileUploadTest</url-pattern> 8 </servlet-mapping>
4.FileItem類幾個方法說明
1)boolean isFormField();該方法判斷是否是普通表單域還是文件上傳表單域。如果是普通文本表單字段,返回一個true否則返回一個false。
2)String getName();用來獲得文件上傳字段中的文件名。
3)String getFieldName();用來返回表單標簽的name屬性的值。
4)void write(File file);write方法將FileItem對象中的內容保存到某個指定的文件中。如果FileItem對象中的內容是保存在某個臨時文件中,該方法完成后,臨時文件可以會被刪除。該方法也可以將普通表單字段保存在一個文件中,但最主要的用途是把上傳的文件內容保存在本地文件系統中。
5)String getString();將FileItem對象中保存的數據流內容以一個字符串返回。它有兩個重載形式。public Java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集編碼將主體內容轉換成字符串,后者使用參數指定的字符集編碼。如果在讀取普通表單字段元素的內容時,出現了亂碼現象,可以調用第二個方法,並傳入 正確的字符集編碼名稱。
6)String getContentType();此方法用來獲得上傳文件的類型,即標段字段元素描述頭屬性“content-type”的值,如image/jpeg。如果FileItem對象對應的是普通的表單字段,將返回null。
7)boolean isInMemory();判斷FileItem對象封裝的數據是保存在內存中還是硬盤中。用來判斷FileItem對象封裝的數據內容是存儲在內存中,還是存儲在臨時文件中,如果存儲在內存中則返回true,否則返回false
8)void delete();此方法用來清空FileItem對象中封裝的主體內容,如果內容是被保存在臨時文件中,該方法會把臨時文件刪除。盡管當FileItem對象被垃圾收集器收集時會自動清除臨時文件,但及時調用delete方法可以更早的清除臨時文件,釋放系統存儲資源。另外,當系統出現異常時,仍有可能造成有的臨時文件被永久保存在了硬盤中。
9)InputStream getInputStream();以流的形式返回上傳文件的主體內容。
10)long getSize();返回上傳文件的大小(以字節為單位)。
5.所需要的jar包,commons-fileupload-1.2.2.jar即可,其需要依賴的其他jar包commons-io-1.3.jar
1)Commons FileUpload,可以在"http://jakarta.apache.org/commons/fileupload/"下載
2)Commons IO,可以在"http://jakarta.apache.org/commons/io/"下載