Servlet 3.0 的文件上傳功能

    利用Servlet 3.0 的新特性可以輕鬆實現從客戶端上傳文件到服務器的功能。

原理:
    首先介紹HttpServletRequest類中包含的涉及到文件上傳的2個函數:
    ① Part getPart(String name):根據文件名來獲取文件上傳域。 
    ② Collection<Part> getParts():獲取所有文件的上傳域。
    上面兩個方法的返回值都涉及到一個API:Part。每個Part對象對應於一個文件上傳域,該對象提供了大量的方法來訪問上傳文件的文件類型、大小、輸入流等,並提供了一個write(String file)方法將上傳的文件寫入服務器的本地磁盤。 
    爲了向服務器上傳文件,需要在表單裏使用<input type="file".../>文件域,這個文件域會在HTML頁面上產生一個單行文本框和一個“瀏覽”按鈕,瀏覽者可通過該按鈕選擇需要上傳的文件。
    除此之外,上傳文件一定要爲表單域設置enctype屬性。該屬性指定的是表單數據的編碼方式,有如下3個屬性值:
    ① application/x-www-form-urlencoded:這是默認的編碼方式,它只處理表單域裏的value屬性值,採用這種編碼方式的表單會將表單域的值處理成URL的編碼方式。
    ② multipart/form-data:這種編碼方式會以二進制流的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數裏。
    ③ text/plain:這種編碼方式當表單的action屬性爲mailto:URL的形式時比較方便,這種方式主要適用於直接通過表單發送郵件。
    如果不設置enctype屬性或將其設置爲application/x-www-form-urlencoded,提交表單時只會發送文件域中文本框內的字符串,也就是瀏覽者所選擇文件的絕對路徑,對服務器獲取該文件沒有任何作用,因爲服務器不可能訪問到客戶機的文件系統。我們需要設置enctype="multipart/form-data"
    最後需要注意的是:處理上傳文件功能的Servlet需要用@MultipartConfig來修飾。

示例:
    下面給出一個簡單的樣例。
    首先是前端頁面的JSP文件,代碼如下:
<%@ page language="java" contentType="text/html; charset=GBK"
	pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title><s:text name="loginPage"/></title>
</head>
<body>
<form method="post" action="upload" enctype="multipart/form-data">
	<input type="file" id="file" name="file" />
	<input type="submit" value="upload" />
</form>
</body>
</html>

    注意設定表單的enctype屬性爲multipart/form-data,另外請求方法必須是POST,筆者親測發現,用GET會出異常。
    接下來是Servlet類,代碼如下:
package fileUploadDemo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * A simple servlet class for file uploading.
 * @author Octopusfly
 * @version 2017-01-24.
 */
@MultipartConfig
public class FileUploadServlet
        extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void service(
            HttpServletRequest request,
            HttpServletResponse response) {
        try {
            Part part = request.getPart("file");
            part.write("E:\\received");
            response.getWriter().println("<html>");
            response.getWriter().println("<body>");
            response.getWriter().println("File uploaded!");
            response.getWriter().println("</body>");
            response.getWriter().println("</html>");
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


    服務端調用getPart方法,就可以得到上傳文件的字節流,然後調用write方法,就可以將文件寫入到本地,這裏僅僅爲了便於演示,筆者寫入到E盤根目錄,同時將文件名設定爲received 

演示:
   配置Servlet,啓動Tomcat服務器後,訪問index.jsp頁面,可以看到下面的界面:
 
    點擊“選擇文件”按鈕,在彈出的對話框中選擇要上傳的文件,可以看到下面的結果:

    這裏,筆者選擇一張圖片上傳,確認後,可以看到下面的界面:
     

    點擊upload按鈕,可以看到如下的結果,文件上傳成功。
    
    打開服務端存儲的路徑,可以看到上傳的文件:
  
 



發佈了75 篇原創文章 · 獲贊 80 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章