# Servlet 文件上傳
Servlet 可以與 HTML form 標簽一起使用,來允許用戶上傳文件到服務器。上傳的文件可以是文本文件或圖像文件或任何文檔。
## 創建一個文件上傳表單
下面的 HTML 代碼創建了一個文件上傳表單。以下幾點需要注意:
* 表單 **method** 屬性應該設置為 **POST** 方法,不能使用 GET 方法。
* 表單 **enctype** 屬性應該設置為 **multipart/form-data**.
* 表單 **action** 屬性應該設置為在后端服務器上處理文件上傳的 Servlet 文件。下面的實例使用了 **UploadServlet** Servlet 來上傳文件。
* 上傳單個文件,您應該使用單個帶有屬性 type="file" 的 <input .../> 標簽。為了允許多個文件上傳,請包含多個 name 屬性值不同的 input 標簽。輸入標簽具有不同的名稱屬性的值。瀏覽器會為每個 input 標簽關聯一個瀏覽按鈕。
```
<html>
<head>
<title>文件上傳表單</title>
</head>
<body>
<h3>文件上傳:</h3>
請選擇要上傳的文件:<br />
<form action="UploadServlet" method="post"
enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="上傳文件" />
</form>
</body>
</html>
```
這將顯示下面的結果,允許用戶從本地計算機選擇一個文件,當用戶點擊"上傳文件"時,表單會連同從本地計算機選擇的文件一起提交:
```
<b>文件上傳:</b>
請選擇要上傳的文件:<br />
<input type="file" name="file" size="50" />
<br />
<input type="button" value="上傳文件" />
<br />
注:這只是虛擬的表單,不會正常工作。
```
## 編寫后臺 Servlet
以下是 Servlet **UploadServlet**,會接受上傳的文件,并把它儲存在目錄 <Tomcat-installation-directory>/webapps/data 中。這個目錄名也可以使用外部配置來添加,比如 web.xml 中的 **context-param** 元素,如下所示:
```
<web-app>
....
<context-param>
<description>Location to store uploaded file</description>
<param-name>file-upload</param-name>
<param-value>
c:\apache-tomcat-5.5.29\webapps\data\
</param-value>
</context-param>
....
</web-app>
```
以下是 UploadServlet 的源代碼,可以一次處理多個文件的上傳。在繼續操作之前,請確認下列各項:
* 下面的實例依賴于 FileUpload,所以一定要確保在您的 classpath 中有最新版本的 **commons-fileupload.x.x.jar** 文件。可以從 [http://commons.apache.org/fileupload/](//commons.apache.org/fileupload/) 下載。
* FileUpload 依賴于 Commons IO,所以一定要確保在您的 classpath 中有最新版本的 **commons-io-x.x.jar** 文件。可以從 [http://commons.apache.org/io/](//commons.apache.org/io/) 下載。
* 在測試下面實例時,您上傳的文件大小不能大于 _maxFileSize_,否則文件將無法上傳。
* 請確保已經提前創建好目錄 c:\temp and c:\apache-tomcat-5.5.29\webapps\data。
```
// 導入必需的 java 庫
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
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;
import org.apache.commons.io.output.*;
public class UploadServlet extends HttpServlet {
private boolean isMultipart;
private String filePath;
private int maxFileSize = 50 * 1024;
private int maxMemSize = 4 * 1024;
private File file ;
public void init( ){
// 獲取文件將被存儲的位置
filePath =
getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
// 檢查我們有一個文件上傳請求
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ){
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// 文件大小的最大值將被存儲在內存中
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// 創建一個新的文件上傳處理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 允許上傳的文件大小的最大值
upload.setSizeMax( maxFileSize );
try{
// 解析請求,獲取文件項
List fileItems = upload.parseRequest(request);
// 處理上傳的文件項
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () )
{
// 獲取上傳文件的參數
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// 寫入文件
if( fileName.lastIndexOf("\\") >= 0 ){
file = new File( filePath +
fileName.substring( fileName.lastIndexOf("\\"))) ;
}else{
file = new File( filePath +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
throw new ServletException("GET method used with " +
getClass( ).getName( )+": POST method required.");
}
}
```
## 編譯和運行 Servlet
編譯上面的 Servlet UploadServlet,并在 web.xml 文件中創建所需的條目,如下所示:
```
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
```
現在嘗試使用您在上面創建的 HTML 表單來上傳文件。當您在瀏覽器中訪問:http://localhost:8080/UploadFile.htm 時,它會顯示下面的結果,這將有助于您從本地計算機上傳任何文件。
```
<b>文件上傳:</b>
請選擇要上傳的文件:<br />
<input type="file" name="file" size="50" />
<br />
<input type="button" value="上傳文件" />
```
如果您的 Servelt 腳本能正常工作,那么您的文件會被上傳到 c:\apache-tomcat-5.5.29\webapps\data\ 目錄中。
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明