1. 程式人生 > >使用第三方元件實現上傳檔案

使用第三方元件實現上傳檔案

使用第三方元件實現上傳檔案功能需要在專案lib下目錄匯入兩個Jar包(commons-fileupload 和  commons-io)

commons-io下載地址:http://commons.apache.org/proper/commons-io/download_io.cgi

commons-fileupload下載地址:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi

關鍵步驟:

  1. 在JSP檔案中使用page指令匯入Commons-FileUpload元件所需的類
  2. 判斷請求資訊中的內容是否是multipart型別,如果是則進行處理
  3. 通過FileItemFactory工廠物件例項化ServletFileUpload物件
  4. 呼叫ServletFileUpload物件的parseRequest()將表單中欄位解析成FileItem物件的集合
  5. 通過迭代依次處理每個FileItem物件,如果是普通欄位,通過getString()方法得到相應表單字元的值,該值與表單欄位中的"name"屬性對應,如果是檔案欄位,則通過File的構造方法構建一個指定路徑名和檔名的檔案,並通過FileItem物件的Write()的方法將上傳檔案的內容儲存到檔案中

 

示例程式碼: 

 

 index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
   <form  action="doindex.jsp"  enctype="multipart/form-data" method="post">
   姓名:<input type="text" name="username">
   <input type="file" name="filename">
   <input type="submit" value="提交">
   </form>
  </body>
</html>

 

處理index.jsp請求的doindex.jsp頁面

<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<%
   request.setCharacterEncoding("utf-8");
   String uploadFileName="";//上傳的檔名
   String fieldName="";//表單欄位name的屬性值
   
   //請求資訊中的內容是否是multipart型別
   boolean isMultipart=ServletFileUpload.isMultipartContent(request);
   //上傳檔案的儲存路徑(伺服器檔案系統上的絕對檔案路徑)
   String uploadFilePath=request.getSession().getServletContext().getRealPath("upload/");
  
   if(isMultipart){
   
   FileItemFactory factory=new DiskFileItemFactory();
   ServletFileUpload upload=new ServletFileUpload(factory);
   
   try{
   List<FileItem> items=upload.parseRequest(request);
   Iterator<FileItem>  iter=items.iterator();
   while(iter.hasNext()){
   
   FileItem item=(FileItem)iter.next();
   if(item.isFormField()){  //普通表單欄位
   fieldName=item.getFieldName();
   
   if(fieldName.equals("username")){
   out.print(item.getString("utf-8")+"上傳了檔案!");
   }
   
   }else{ //檔案表單欄位
   
   String fileName=item.getName();
   if(fileName!=null && !fileName.equals("")){
   File fullFile=new File(item.getName());
   
   File saveFile=new File(uploadFilePath,fullFile.getName());
   item.write(saveFile);
   uploadFileName=fullFile.getName();
   out.print("上傳成功後的檔名是:"+uploadFileName);
   }
   
   }
   
   }
   
   }catch(Exception e){
   e.printStackTrace();
   }

   }
 %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'doindex.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->


  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>