ServletFileUpload使用方法

當咱們在 HTML 表單中選擇本地文件以後點擊「提交」按鈕則會將文件上傳到服務器中,此時該 HTTP 請求正文的數據類型就是 multipart/form-data 型的。而在 Servlet 技術中,該 HTTP 請求會被 Servlet 容器(如 Tomcat)包裝成 HttpServletRequest 對象,再由端所請求的相應 Servlet 進行處理。 html

可是,若是此時咱們在服務器端編寫的 Servlet 一點點地解析這個 HTTP 請求,分離出其中的文本表單和上傳的文件類型,這未免有點低效。因而,咱們可使用 Apache 開源上傳軟件包 fileupload 來簡化這一過程,直接使用便可。下載地址:http://commons.apache.org/fileupload/ java

在 fileupload 包中, HTTP 請求中的複雜表單元素都被看作一個 FileItem 對象;FileItem 對象必須由 ServletFileUpload 類中的 parseRequest() 方法解析 HTTP 請求(即被包裝以後的 HttpServletRequest 對象)出來,即分離出具體的文本表單和上傳文件;而 ServletFileUpload 對象的建立須要依賴於 FileItemFactory 工廠將得到的上傳文件 FileItem 對象保存至服務器硬盤,即 DiskFileItem 對象。 web

呼…把這個 fileupload 包中的關係講得那麼亂,最好仍是本身看下載下來的幫助文檔。不過,推薦一個免費的 Java 反編譯器 JD-GUI ,用它可以很輕鬆地打開 .jar 文件,除了源代碼中的註釋,其餘的一覽無遺,很好用啊。下載地址:http://java.decompiler.free.fr/?q=jdgui apache

好吧,咱們的程序要求: 瀏覽器

一、提供一個 HTML 文件,用戶可在相應表單中選擇須要上傳的文件; 緩存

二、編寫一個名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表單所提交的 HTTP 請求,把普通的文本域和文件域分離開來; 服務器

三、UploadServlet 根據 web.xml 配置文件中的初始化參數肯定好須要在 Web 服務器存放該文件的目錄,將上傳的文件寫入到該存放目錄中,在個人這裏我把上傳的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目錄中,而 F:\java\JavaWeb\ch05\temp 目錄則用做該 Web 應用的臨時目錄。 app

程序代碼: ui

upload.html 文件 url

<html>  
    <head>  <title>Servlet 上傳文件</title></head>  
    <body >  
      <form name="uploadForm" method="POST"  
        enctype="MULTIPART/FORM-DATA"  
        action="upload">  
  
        User Name:<input type="text" name="username" size="30"/>  
        Upload File1:<input type="file" name="file1" size="30"/>  
        Upload File2:<input type="file" name="file2" size="30"/>    
        <input type="submit" name="submit" value="上傳">  
        <input type="reset" name="reset" value="重置">  
      </form>  
    </body>  
</html>





UploadServlet.java 文件

import javax.servlet.*;   
import javax.servlet.http.*;   
import java.io.*;   
import java.util.*;   
import org.apache.commons.fileupload.*;   
import org.apache.commons.fileupload.servlet.*;   
import org.apache.commons.fileupload.disk.*;   
  
// Servlet 文件上傳   
public class UploadServlet extends HttpServlet   
{   
    private String filePath;    // 文件存放目錄   
    private String tempPath;    // 臨時文件目錄   
  
    // 初始化   
    public void init(ServletConfig config) throws ServletException   
    {   
        super.init(config);   
        // 從配置文件中得到初始化參數   
        filePath = config.getInitParameter("filepath");   
        tempPath = config.getInitParameter("temppath");   
  
        ServletContext context = getServletContext();   
  
        filePath = context.getRealPath(filePath);   
        tempPath = context.getRealPath(tempPath);   
        System.out.println("文件存放目錄、臨時文件目錄準備完畢 ...");   
    }   
       
    // doPost   
    public void doPost(HttpServletRequest req, HttpServletResponse res)   
        throws IOException, ServletException   
    {   
        res.setContentType("text/plain;charset=gbk");   
        PrintWriter pw = res.getWriter();   
        try{   
            DiskFileItemFactory diskFactory = new DiskFileItemFactory();   
            // threshold 極限、臨界值,即硬盤緩存 1M   
            diskFactory.setSizeThreshold(4 * 1024);   
            // repository 貯藏室,即臨時文件目錄   
            diskFactory.setRepository(new File(tempPath));   
           
            ServletFileUpload upload = new ServletFileUpload(diskFactory);   
            // 設置容許上傳的最大文件大小 4M   
            upload.setSizeMax(4 * 1024 * 1024);   
            // 解析HTTP請求消息頭   
            List fileItems = upload.parseRequest(req);   
            Iterator iter = fileItems.iterator();   
            while(iter.hasNext())   
            {   
                FileItem item = (FileItem)iter.next();   
                if(item.isFormField())   
                {   
                    System.out.println("處理表單內容 ...");   
                    processFormField(item, pw);   
                }else{   
                    System.out.println("處理上傳的文件 ...");   
                    processUploadFile(item, pw);   
                }   
            }// end while()   
  
            pw.close();   
        }catch(Exception e){   
            System.out.println("使用 fileupload 包時發生異常 ...");   
            e.printStackTrace();   
        }// end try ... catch ...   
    }// end doPost()   
  
  
    // 處理表單內容   
    private void processFormField(FileItem item, PrintWriter pw)   
        throws Exception   
    {   
        String name = item.getFieldName();   
        String value = item.getString();           
        pw.println(name + " : " + value + "\r\n");   
    }   
       
    // 處理上傳的文件   
    private void processUploadFile(FileItem item, PrintWriter pw)   
        throws Exception   
    {   
        // 此時的文件名包含了完整的路徑,得注意加工一下   
        String filename = item.getName();          
        System.out.println("完整的文件名:" + filename);   
        int index = filename.lastIndexOf("\\");   
        filename = filename.substring(index + 1, filename.length());   
  
        long fileSize = item.getSize();   
  
        if("".equals(filename) && fileSize == 0)   
        {              
            System.out.println("文件名爲空 ...");   
            return;   
        }   
  
        File uploadFile = new File(filePath + "/" + filename);   
        item.write(uploadFile);   
        pw.println(filename + " 文件保存完畢 ...");   
        pw.println("文件大小爲 :" + fileSize + "\r\n");   
    }   
       
    // doGet   
    public void doGet(HttpServletRequest req, HttpServletResponse res)   
        throws IOException, ServletException   
    {   
        doPost(req, res);   
    }   
}



web.xml 文件

<?xml version="1.0" encoding="gb2312"?>  
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  
    version="2.4">  
  
    <servlet>  
        <servlet-name>UploadServlet</servlet-name>  
        <servlet-class>UploadServlet</servlet-class>  
  
        <init-param>  
            <param-name>filepath</param-name>  
            <param-value>uploadFile</param-value>  
        </init-param>  
        <init-param>  
            <param-name>temppath</param-name>  
            <param-value>temp</param-value>  
        </init-param>  
    </servlet>       
  
    <servlet-mapping>  
        <servlet-name>UploadServlet</servlet-name>  
        <url-pattern>/upload</url-pattern>  
    </servlet-mapping>  
  
</web-app>



程序運行過程截圖:(在 web.xml 文件中咱們把UploadServlet 映射爲 upload

一、啓動 Tomcat ,在瀏覽器輸入 URL 並填寫 HTML 表單,以下:

uploadServlet01

二、點擊「上傳」,發出一個包含了上傳文件的複雜 HTTP 請求,由 UploadServlet 進行處理:

先看下 Tomcat 的控制檯輸出信息:

uploadServlet02

再看一下瀏覽器的相應輸出:

uploadServlet03

最後看上傳的文件是否被被保存在指定的目錄中:

uploadServlet04

嗯,文件目錄和文件保存時間都正確,就是文件大小忘了轉化一下…(*^__^*) …

小結:

一、使用開源的 fileupload 包爲咱們在 UploadServlet 代碼中顯式地用繁雜的 request.getParameter(「username」) 語句來獲取 HTTP 請求所包含的表單值;

二、並且還省去了咱們在 UploadServlet 中本身編寫判斷表單是不是文件或文本類型的代碼;

三、更重要的是,FileItem 對象的響應方法可使得咱們輕鬆地獲取文件名、文件大小、路徑等等;

四、最重要的是,使用 JD-GUI 反編譯器簡單地看看開源的 fileupload 包中的類組織結構,這更加有意思、有用處,:-D

本文出自 「螞蟻」 博客,請務必保留此出處http://haolloyin.blog.51cto.com/1177454/368162

相關文章
相關標籤/搜索