commons-fileupload框架源碼解析(一)--實例

  1. commons-fileupload框架源碼解析(一)--實例
  2. commons-fileupload框架源碼解析(二)--HTTP
  3. commons-fileupload框架源碼解析(三)--ParseRequest
  4. commons-fileupload框架源碼解析(四)--FileItemIterator
  5. commons-fileupload框架源碼解析(五)--MultipartStream
  6. commons-fileupload框架源碼解析(六)--ParameterParser
  7. commons-fileupload框架源碼解析(七)--FileCleaningTracker
  8. commons-fileupload框架源碼解析(八)--DeferredFileOutputStream

前言

commons-fileupload雖然我經(jīng)常會在項目里用的弄贿,它有非常強大的文件上傳功能翎承,雖然經(jīng)常用响鹃,卻不曾了解過其源碼的實現(xiàn)亮垫,為了讓自己更加牛B,更好的掌握文件上傳的原理和具體實現(xiàn)方式谍倦,我開始了長達一個月的解析該框架源碼的工作瘦锹,總算將框架的實現(xiàn)原理給摸清悉患。是時候?qū)懸幌盗胁┛蛠硌bB,comons-fileupload的版本是1.4

第一章簡介

第一章的我并不是馬上講起原理季俩,而是直接我的用例展現(xiàn)出來,我打算通過該用例去解析其原理翎卓。

用例

只是一個普通的JavaWeb項目,代碼的實現(xiàn)都在FileUploadServlet里

目錄結(jié)構(gòu)截圖

項目目錄結(jié)構(gòu).png

pom.xml

  <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.4</version>
      </dependency>

FileUploadServlet

package bin.study;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Iterator;
import java.util.List;

/**
 * 實現(xiàn)文件上傳的Servlet
 * @author Administrator
 *
 */
public class FileUploadServlet extends HttpServlet {


    //上傳路徑
    private File uploadPath;


    //當文件過大時偶房,需要設置一個臨時路徑
    private File tempPath;


    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 內(nèi)存存儲的最大值
        factory.setSizeThreshold(4096);

        factory.setRepository(tempPath);

        ServletFileUpload upload = new ServletFileUpload(factory);
        //設置文件上傳大小
        upload.setSizeMax(1000000 * 20);
        try {
            List fileItems = upload.parseRequest(req);
            String itemNo = "";
            for (Iterator iter = fileItems.iterator(); iter.hasNext(); ) {
                FileItem item = (FileItem) iter.next();

                //是普通的表單輸入域
                if (item.isFormField()) {
                    if ("itemNo".equals(item.getFieldName())) {
                        itemNo = item.getString();
                    }
                }
                //是否為input="type"輸入域
                if (!item.isFormField()) {
                    String fileName = item.getName();
                    long size = item.getSize();
                    if ((fileName == null || fileName.equals("")) && size == 0) {
                        continue;
                    }
                    //截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
                    //item.write(new File(uploadPath + itemNo + ".gif"));
                    item.write(new File(uploadPath, itemNo + ".gif"));
                }
            }
            //重定向頁面
            res.sendRedirect(req.getContextPath() + "/servlet/item/SearchItemServlet");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化方法趁曼,設定目錄
     */
    public void init() throws ServletException {
        uploadPath = new File(getServletContext().getRealPath("upload"));
        //System.out.println("uploadPath=====" + uploadPath);
        //如果目錄不存在
        if (!uploadPath.exists()) {
            //創(chuàng)建目錄
            uploadPath.mkdir();
        }

        //臨時目錄
        tempPath = new File(getServletContext().getRealPath("temp"));
        if (!tempPath.exists()) {
            tempPath.mkdir();
        }
    }
}

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>fileUploadServlet</servlet-name>
    <servlet-class>bin.study.FileUploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>fileUploadServlet</servlet-name>
    <url-pattern>/fileUploadServlet</url-pattern>
  </servlet-mapping>
</web-app>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棕洋,隨后出現(xiàn)的幾起案子彰阴,更是在濱河造成了極大的恐慌,老刑警劉巖拍冠,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異簇抵,居然都是意外死亡庆杜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門碟摆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃财,“玉大人,你說我怎么就攤上這事典蜕《鲜ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵愉舔,是天一觀的道長钢猛。 經(jīng)常有香客問我,道長轩缤,這世上最難降的妖魔是什么命迈? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮火的,結(jié)果婚禮上壶愤,老公的妹妹穿的比我還像新娘。我一直安慰自己馏鹤,他們只是感情好征椒,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湃累,像睡著了一般勃救。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脱茉,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天剪芥,我揣著相機與錄音,去河邊找鬼琴许。 笑死税肪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播益兄,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锻梳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了净捅?” 一聲冷哼從身側(cè)響起疑枯,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛔六,沒想到半個月后荆永,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡国章,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年具钥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液兽。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡骂删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出四啰,到底是詐尸還是另有隱情宁玫,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布柑晒,位于F島的核電站欧瘪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敦迄。R本人自食惡果不足惜恋追,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罚屋。 院中可真熱鬧苦囱,春花似錦、人聲如沸脾猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猛拴。三九已至羹铅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愉昆,已是汗流浹背职员。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跛溉,地道東北人焊切。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓扮授,卻偏偏與公主長得像,于是被迫代替她去往敵國和親专肪。 傳聞我的和親對象是個殘疾皇子刹勃,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354