# JSP 文件上傳
JSP可以通過HTML的form表單上傳文件到服務器。 文件類型可以是文本文件、二進制文件、圖像文件等其他任何文檔。
## 創建文件上傳表單
接下來我們使用HTML標簽來創建文件上傳表單,以下為要注意的點:
* form表單 **method** 屬性必須設置為 **POST** 方法 ,不能使用 GET 方法。
* form表單 **enctype** 屬性需要設置為 **multipart/form-data**。
* form表單 **action** 屬性需要設置為提交到后臺處理文件上傳的jsp文件地址。例如 **uploadFile.jsp** 程序文件用來處理上傳的文件。
* 上傳文件元素需要使用 <input .../> 標簽,屬性設置為 type="file"。如果需要上傳多個文件,可以在 <input .../>標簽中設置不同的名稱。
以下是一個上傳文件的表單,實例如下:
```
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
```
在你本地瀏覽器訪問該文件,顯示界面如下所示,在你點擊"Upload File"會彈出一個窗口讓你選擇要上傳的文件:

## 后臺JSP處理腳本
首先我們先定義文件上傳后存儲在服務上的位置,你可以將路徑寫在你的程序當中,或者我們可以在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>
```
以下腳本文件UploadFile.jsp可以處理多個上傳的文件,在使用該腳本前,我們需要注意以下幾點:
* 以下實例依賴 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 和 c:\apache-tomcat-5.5.29\webapps\data 。
```
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<%
File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
ServletContext context = pageContext.getServletContext();
String filePath = context.getInitParameter("file-upload");
// 驗證上傳內容了類型
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 設置內存中存儲文件的最大值
factory.setSizeThreshold(maxMemSize);
// 本地存儲的數據大于 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>JSP File 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();
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: " + filePath +
fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}else{
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>");
}
%>
```
接下來讓我們通過瀏覽器訪問 _http://localhost:8080/UploadFile.htm_,界面如下所示,并上傳文件:

如果你的JSP腳本運行正常,文件將被上傳至 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 國際化
- 免責聲明