apache文件上傳組件詳解

************本人水平有限,在學習時請用批判的態度學習,有問題給我留言************

 

說詳解有點沒有底氣了,這是講文件上傳時的一個例子,我把每一行代碼的註釋都寫了出來,加強理解,熟悉api。

 

我把上傳文件功能放到了一個工程裏,前臺有一個index.jsp頁面,一個success.jsp頁面

一個js目錄、一個css文件

需要apache commons-fileupload包

commons-io包

前臺還有個js的小例子,模擬軟鍵盤,例子不是原創,只是爲了美化前臺。

 

工程下載地址:http://download.csdn.net/source/1458143

 

廢話不多說了,上代碼!!


下面的是核心的servlet

 

package cn.itcast.upload;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * 文件上傳 servlet
 * 詳盡註釋每一步做法和含義,方便大家學習
 *
 * @version 1.0
 * @author caohua
 * @company 傳智博客
 */
public class FileUploadServlet extends HttpServlet {

    /**
     * 序列化servlet,防止鈍化後無法恢復的問題
     */
    private static final long serialVersionUID = 1L;

    public FileUploadServlet() {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=gb2312");//設置返回頭信息
        PrintWriter out = response.getWriter();//返回的輸出
       
        String path = getServletContext().getRealPath("/upload");//得到該應用下的upload目錄在服務器上的絕對路徑
   
        if( path == null ){//如果爲空表示不能訪問,可能是系統設置了訪問權限
            out.print("無法訪問該目錄!");
            return;
        }
       
        File uploadDir = new File(path);//得到該目錄的文件對象
       
        if(!uploadDir.exists()){//判斷該目錄是否存在
           
            if(!uploadDir.mkdir()){//如果不存在就建立該目錄
                out.print("無法創建該目錄!");//如果建立失敗,給出提示
                return;
            }
        }
       
        if(!ServletFileUpload.isMultipartContent(request)){//用 ServletFileUpload 類的靜態方法 isMultipartContent 判斷 request 是否是 multipart/form-data 類型
            out.print("只能 multipart/form-data 類型數據");
            return;
        }
        //創建 DiskFileItemFactory 對象
        DiskFileItemFactory factory = new DiskFileItemFactory();
       
        //factory.setRepository(tempDir);可以設置緩存目錄
        factory.setSizeThreshold(1024 * 1024);//超過1m的數據採用臨時文件緩存
       
        ServletFileUpload upload = new ServletFileUpload(factory);//創建 ServletFileUpload 對象,構造的時候傳一個 DiskFileItemFactory 對象進去
        upload.setFileSizeMax(1024 * 1024 * 2);//單個文件大小
        upload.setHeaderEncoding("gb2312");//設置普通字段名稱和文件字段的文件名所採用的字符集編碼
        upload.setSizeMax(1024 * 1024 * 4);//最多上傳2m的文件
       
        List list = null;
        try {
            list = upload.parseRequest(request);//解析 request 對象 得到一個包含 FileItem 對象的 list
        } catch (FileUploadException e) {
            out.print("解析文件時出現問題:");
            e.printStackTrace();
            return;
        }
       
        Iterator it = list.iterator();//遍歷list
        while(it.hasNext()){
            FileItem fi = (FileItem)it.next();//類型轉換
           
            if(fi.isFormField()){//判斷該 FileItem 對象是否是一個普通表單類型
                String name = fi.getFieldName();//得到普通表單類型的表單名
                String content = fi.getString("GB2312");//用指定編碼得到普通表單的值
                request.setAttribute(name, content);//把鍵值放入 request 對象
            }else{
                try{
                    String pathStr = fi.getName();//得到文件表單的值,就是用戶本地的文件路徑
                    //如果文件表單爲空,則不處理
                    if(pathStr.trim().equals("")){
                        continue;
                    }
                   
                    int start = pathStr.lastIndexOf("//");//得到文件名在路徑中的位置
                    String fileName = pathStr.substring(start + 1);//得到文件名
                   
                    File pathDest = new File( path , fileName );//創建上傳上來的文件對象  由服務器上存放文件的路徑 + 文件名 組成
                   
                    fi.write(pathDest);//寫文件
                   
                    String name = fi.getFieldName();//得到文件表單的名稱
                    request.setAttribute(name, fileName);//把表單名、文件名放入 request
                   
                }catch(Exception e){
                    out.print("存儲文件錯誤:");
                    e.printStackTrace();
                    return;
                }
                finally{//立即刪除保存表單字段內容的臨時文件
                    fi.delete();
                }
            }
        }
       
        StringBuffer filelist = new StringBuffer();//得到可變字符串對象
       
        //把上傳的文件名拼裝到可變字符串中
        String file1 = (String)request.getAttribute("file1");
        makeUplist(filelist, file1);
        String file2 = (String)request.getAttribute("file2");
        makeUplist(filelist, file2);
       
        request.setAttribute("list", filelist);//把文件名的字符串放入 request
        request.getRequestDispatcher("success.jsp").forward(request, response);//請求轉發到指定頁面
       
    }
    /**
     * 將 str 追加到 sb中,以“,”隔開
     * @param sb
     * @param str
     */
    private void makeUplist(StringBuffer sb ,String str){
       
        if(str != null){//追加的字符串爲空則不做任何操作
            if(sb.length() != 0){//如果可變字符串長度不爲0,需要用“,”隔開
                sb.append(",");
            }
            sb.append(str);//追加字符串
        }
       
    }

    public void init() throws ServletException {
    }

}

 

 

下面是index.jsp

<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>傳智博客---文件上傳</title>
<style type="text/css">
    body {
    font-size: 100%;
    font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif;
    padding-top: 100px;
    }
    label { display: block; margin-top: 10px; }
    #login { width: 300px; margin: 0 auto; border: 1px solid #eee; padding: 25px; background-color: #FFFFCC; }
    a { color: #0066CC; text-decoration: none; border-bottom: 1px dotted #0066cc; }
    #submit_butt { margin-top: 15px; }
    h3 { margin-top: 0; }
</style>
<link href="keyboardstyle.css" type="text/css" rel="stylesheet" />
</head>

<body>

<div id="login">

<h3>文件上傳</h3>
<form action="fileupload" method="post" enctype="multipart/form-data">
    <label for="username">用戶名:</label>
    <input type="text" name="name" id="username" />
   
    <label for="pwd">密碼:</label>
    <input type="text" name="password" id="pwd"/>
    <a href="#" id="showkeyboard" title="Type in your password using a virtual keyboard.">鍵盤</a> <br />
   
    <label for="pwd">文件1:</label>
    <input type="file" name="file1" />
    <label for="pwd">文件2:</label>
    <input type="file" name="file2" />
    <br>
    <input type="submit" name="Submit" id="submit_butt" value="提交" />
</form>

<div id="keyboard">
    <div id="row0">
        <input name="accent" type="button" value="`" />
        <input name="1" type="button" value="1" />
        <input name="2" type="button" value="2" />
        <input name="3" type="button" value="3" />
        <input name="4" type="button" value="4" />
        <input name="5" type="button" value="5" />
        <input name="6" type="button" value="6" />
        <input name="7" type="button" value="7" />
        <input name="8" type="button" value="8" />
        <input name="9" type="button" value="9" />
        <input name="0" type="button" value="0" />
        <input name="-" type="button" value="-" />
        <input name="=" type="button" value="=" />
        <input name="backspace" type="button" value="Backspace" />
    </div>
   
    <div id="row0_shift">
        <input name="tilde" type="button" value="~" />
        <input name="exc" type="button" value="!" />
        <input name="at" type="button" value="@" />
        <input name="hash" type="button" value="#" />
        <input name="dollar" type="button" value="$" />
        <input name="percent" type="button" value="%" />
        <input name="caret" type="button" value="^" />
        <input name="ampersand" type="button" value="&" />
        <input name="asterik" type="button" value="*" />
        <input name="openbracket" type="button" value="(" />
        <input name="closebracket" type="button" value=")" />
        <input name="underscore" type="button" value="_" />
        <input name="plus" type="button" value="+" />
        <input name="backspace" type="button" value="Backspace" />
    </div>
   
    <div id="row1">
        <input name="q" type="button" value="q" />
        <input name="w" type="button" value="w" />
        <input name="e" type="button" value="e" />
        <input name="r" type="button" value="r" />
        <input name="t" type="button" value="t" />
        <input name="y" type="button" value="y" />
        <input name="u" type="button" value="u" />
        <input name="i" type="button" value="i" />
        <input name="o" type="button" value="o" />
        <input name="p" type="button" value="p" />
        <input name="[" type="button" value="[" />
        <input name="]" type="button" value="]" />
        <input name="/" type="button" value="/" />
    </div>
   
    <div id="row1_shift">
        <input name="Q" type="button" value="Q" />
        <input name="W" type="button" value="W" />
        <input name="E" type="button" value="E" />
        <input name="R" type="button" value="R" />
        <input name="T" type="button" value="T" />
        <input name="Y" type="button" value="Y" />
        <input name="U" type="button" value="U" />
        <input name="I" type="button" value="I" />
        <input name="O" type="button" value="O" />
        <input name="P" type="button" value="P" />
        <input name="{" type="button" value="{" />
        <input name="}" type="button" value="}" />
        <input name="|" type="button" value="|" />
    </div>
   
    <div id="row2">
        <input name="a" type="button" value="a" />
        <input name="s" type="button" value="s" />
        <input name="d" type="button" value="d" />
        <input name="f" type="button" value="f" />
        <input name="g" type="button" value="g" />
        <input name="h" type="button" value="h" />
        <input name="j" type="button" value="j" />
        <input name="k" type="button" value="k" />
        <input name="l" type="button" value="l" />
        <input name=";" type="button" value=";" />
        <input name="'" type="button" value="'" />   
    </div>
   
    <div id="row2_shift">
        <input name="a" type="button" value="A" />
        <input name="s" type="button" value="S" />
        <input name="d" type="button" value="D" />
        <input name="f" type="button" value="F" />
        <input name="g" type="button" value="G" />
        <input name="h" type="button" value="H" />
        <input name="j" type="button" value="J" />
        <input name="k" type="button" value="K" />
        <input name="l" type="button" value="L" />
        <input name=";" type="button" value=":" />
        <input name="'" type="button" value='"' />
    </div>
   
    <div id="row3">
        <input name="Shift" type="button" value="Shift" id="shift" />
        <input name="z" type="button" value="z" />
        <input name="x" type="button" value="x" />
        <input name="c" type="button" value="c" />
        <input name="v" type="button" value="v" />
        <input name="b" type="button" value="b" />
        <input name="n" type="button" value="n" />
        <input name="m" type="button" value="m" />
        <input name="," type="button" value="," />
        <input name="." type="button" value="." />
        <input name="/" type="button" value="/" />
    </div>
   
    <div id="row3_shift">
        <input name="Shift" type="button" value="Shift" id="shifton" />
        <input name="Z" type="button" value="Z" />
        <input name="X" type="button" value="X" />
        <input name="C" type="button" value="C" />
        <input name="V" type="button" value="V" />
        <input name="B" type="button" value="B" />
        <input name="N" type="button" value="N" />
        <input name="M" type="button" value="M" />
        <input name="lt" type="button" value="&lt;" />
        <input name="gt" type="button" value="&gt;" />
        <input name="?" type="button" value="?" />
    </div>
   
    <div id="spacebar">
        <input name="spacebar" type="button" value=" " />
    </div>
   
</div>

</div>

<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-personalized-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-fieldselection.js"></script>

<script type="text/javascript" src="js/vkeyboard.js"></script>

</body>

</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章