Transcript JSP 之檔案上傳
客戶端的檔案上傳
HTML的檔案欄位標籤
使用Java I/O類別上傳檔案
使用JSP檔案上傳套件上傳檔案
HTML的檔案欄位標籤
HTML檔案欄位可以在瀏覽程式檢視或選擇客戶
端的檔案清單,選擇的檔案是儲存在客戶端電腦,
然後將選擇檔案以HTTP POST方法上傳到Web
伺服器,其基本語法如下所示:
<input type="FILE" name="field_name">
檔案欄位的主要目的是上傳檔案,所以表單
<form>標籤需要設定enctype屬性,如下所示:
<form action="filename.jsp" method="post"
enctype="multipart/form-data">
表單的處理程式為JSP程式,使用post方法送出,
encytype屬性為上傳檔案資料的編碼方式。
使用Java I/O類別上傳檔案-開啟
串流
在建立上傳檔案的HTML表單後,表單處理的JSP
程式可以使用Java I/O類別將上傳檔案資料寫成
伺服端的檔案。首先取得輸入串流,如下所示:
ServletInputStream in =
request.getInputStream();
程式碼使用request物件的getInputStream()
方法取得ServletInputStream的輸入串流,這
就是客戶端上傳檔案的送出的檔案串流。
接著可以在伺服端開啟檔案輸出串流,如下:
PrintWriter pw = new PrintWriter(
new BufferedWriter(new FileWriter(name)));
使用Java I/O類別上傳檔案-上傳
檔案
最後使用while迴圈建立伺服端檔案,如下
所示:
while ((ch = in.read()) != -1)
pw.print((char) ch);
上述while迴圈使用read()方法從
ServletInputStream讀入資料後,馬上將
它使用print()方法寫入PrintWriter串流的
伺服端檔案。
範例
<form action="Ch12_3_3.jsp" method="POST"
enctype="multipart/form-data">
選擇上傳檔案: <input type="FILE"
name="file1"><br>
選擇上傳檔案: <input type="FILE"
name="file2"><br>
選擇上傳檔案: <input type="FILE"
name="file3"><br>
上傳檔案說明: <input type="TEXT"
name="description"><br><br>
<input type="submit" name="Upload" value="上
傳檔案">
</form><hr>
範例
<!-- JSP程式:Ch12_3_2.jsp -->
<%@ page contentType="text/html; charset=MS950"
import="java.io.*"%>
<html>
<head><title>Ch12_3_2</title></head>
<body>
<%
// 輸出的檔案名稱
String name=application.getRealPath("/a.txt");
String file_name=request.getParameter("file1");
out.println(file_name);
// 取得輸入串流
ServletInputStream in = request.getInputStream();
// 建立BufferedWriter的輸出串流物件
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(name)));
int ch;
// 將輸入串流的資料寫入檔案
while ((ch = in.read()) != -1)
pw.print((char)ch);
pw.close(); // 關閉串流
out.print("上傳檔案成功..."+name+"<br>");
%>
</body>
</html>
使用JSP檔案上傳套件上傳檔案下載與安裝O’Reilly上傳套件
O’Reilly上傳套件是由Jason Hunter開發的Java套件,
可以免費下載使用在非商業用途的Web應用程式,免費下
載網址如下所示:
http://www.servlets.com/cos/
上述網址可下載最新版的上傳套件,下載檔案是ZIP格式
壓縮檔,教學網頁上的版本是2002年11月版,檔案名稱
為cos-05Nov2002.zip。
O’Reilly上傳套件的安裝十分簡單,只需將檔案解壓縮到
Web應用程式的「WEB-INF」資料夾即可,這是一些安
裝在classes資料夾下,屬於com.oreilly.servlet.*套件
的Java類別檔。
例如:將壓縮檔內的classes資料夾移入某專案檔內
c:\workspace\file_up\WEB-INF\classes
(請使用refresh確保能正確的import)
使用JSP檔案上傳套件上傳檔案-建
立MultipartRequest物件
使用O’Reilly上傳套件同時上傳多個檔案
JSP程式可以使用page指引元素匯入套件的
MultipartRequest類別,如下所示:
<%@ page
import="com.oreilly.servlet.MultipartRequest“
%>
接下來可以建立MultipartRequest物件取得上傳
檔案和檔案的相關資訊,如下所示:
MultipartRequest mreq = new
MultipartRequest(
request,path,maxSize,"MS950");
使用JSP檔案上傳套件上傳檔案MultipartRequest物件方法
方法
String getParameter(String)
說明
取得名為 String 的表單欄位值,傳回值
null,表示欄位不存在
Enumeration getParameterNames() 取得所有表單欄位名稱的 Enumeration 物件
String[]
取得參數 String 表單欄位的所有內容,傳
getParameterValues(String)
回值 null,表示欄位不存在
Enumeration getFileNames()
取得所有 HTML 檔案標籤 name 屬性名稱
的 Enumeration 物件
String getFilesystemName(String) 取得參數 String 檔案標籤 name 屬性名稱的
上傳檔案名稱
String getContextType(String) 取得參數 String 檔案標籤 name 屬性名稱的
上傳檔案的 MIME 型態
File getFile(String)
取得參數 String 檔案標籤 name 屬性名稱的
File 物件
範例
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>File_Chinese.jsp</title>
</head>
<body>
test
<%
// 宣告將上傳之檔案放置到伺服器的目錄中
// 宣告限制上傳之檔案大小為 50 MB
String saveDirectory = "c:\\test"; //String saveDirectory =aplication.getRealPath(“/”);
int maxPostSize = 50 * 1024 * 1024 ;
// 宣告上傳檔案名稱
String strFileName = null;
// 宣告上傳檔案型態
String strContentType = null;
// 宣告敘述上傳檔案內容敘述
String strDescription = null;
// 為Big5或MS950則支援中文檔名
String enCoding = "MS950";
out.println("Yes");
// 產一個新的MultipartRequest 的物件,multi
MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize, enCoding);
// 取得所有上傳之檔案輸入型態名稱及敘述
strFileName = multi.getFilesystemName("File1");
strContentType = multi.getContentType("File1");
strDescription = multi.getParameter("Desc1");
out.print("檔案名稱為:"+ strFileName+" 檔案型態為:"+ strContentType +
"檔案的敘述:"+strDescription +"<br>");
%>
</body>
</html>
使用JSP檔案上傳套件上傳檔案-處
理多個上傳檔案
在HTML表單上傳的檔案可能不只一個,JSP程式
可以使用getFileNames()方法取得所有HTML檔
案標籤name屬性值的Enumeration物件,然後
配合while迴圈取出所有上傳檔案的相關資訊,如
下所示:
Enumeration files = mreq.getFileNames();
while ( files.hasMoreElements() ) {
String name = (String)files.nextElement();
………….
}
範例
<!-- JSP程式:Ch12_3_3.jsp -->
<%@ page contentType="text/html; charset=MS950"%>
<%@ page import="java.util.*"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<html>
<head><title>Ch12_3_3.jsp</title></head>
<body>
<%
int fcount = 0; // 計算上傳檔案數
// 指定上傳目錄
String path = application.getRealPath("/");
int maxSize = 2*1024*1024; // 上傳檔案最大尺寸為2MB
// 建立MultipartRequest物件
MultipartRequest mreq = new MultipartRequest(request, path, maxSize, "MS950");
// 取得表單欄位值
String str = mreq.getParameter("description");
out.print("說明: " + str + "<br>");
// 使用Enumeration物件取得上傳檔案資訊
Enumeration files = mreq.getFileNames();
while ( files.hasMoreElements() ) {
String name = (String)files.nextElement();
str = mreq.getFilesystemName(name); // 取得檔名
if ( str != null ) { // 檔名不是null
fcount++; // 上傳檔案數加一
out.print("編號: (" + fcount + ")<br>");
out.print("檔名: " + str + "<br>");
str = mreq.getContentType(name); // 取得型態
out.print("型態: " + str + "<br>");
}
}
out.print("上傳檔案數: " + fcount + "<br>");
%>
</body>
</html>