JSP多文件上傳到服務器


問題描述:

  作為一個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'>&nbsp;"+"<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">&nbsp;
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/"下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM