原理:
首先介紹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的形式時比較方便,這種方式主要適用於直接通過表單發送郵件。
最後需要注意的是:處理上傳文件功能的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>
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();
}
}
}