文件上傳是許多項目都遇到的需求,Struts2中也帶有文件上傳功能,但它是利用的java領域的其他 倆個常用的文件上傳的項目:Common- FileUpload和COS,在了解Struts2之前讓我們了解下怎樣使用 Common-FileUpload來實現文件上傳以及文件上傳實現過程中應該注意的問題。
在Common- FileUpload中,它把從客戶端提交過來的表單封裝成一個個FileItem對象,這也是它實現文件上傳功能 的核心類。另一個很重要的類就是FileUploadBase,他的功能就是解析請求(request),如進行上傳文 件大小驗證,請求類型驗證(文件上傳的enctype要設置成multipart/form-data)等。我們經常用到它 的子類ServletFileUpload。在FileUploadBase解析 request的過程中會將文件保存到內存,如果文件大 小大於我們設置的緩存的大小,它將把文件的其他內容保存到一個臨時目錄,當我們對FileItem 對象實 現正真上傳時會從內存區或臨時目錄將文件保存到正真的上傳目錄。而我們要做的就是進行簡單的配置 ,可以用很少的代碼就可以實現文件上傳,而不用直接與IO流打交道。首先將文件上傳過程中應注意的 地方了解下:
1.request請求的方法一定要是POST:method="post"
2.request請求的類型 一定要是multipart/form-data: enctype="multipart/form-data"
3.在對DiskFileItemFacotry 設置過程中repository參數代表文件保存的臨時目錄,如果不設置,系統將以System.getProperty ("java.io.tmpdir")代表的目錄作為臨時目錄。
4.DiskFileItemFacotry中的sizeThreshold參數 代表保存到內存的大小,如果當個上傳文件的大小小於這個值,則這個文件會暫時保存到內存中。如果 大於這個值,則多的部分會保存到臨時目錄中。單位為B。
5.ServletFileUpload中的sizeMax參 數是代表上傳文件的總大小,單位為B
6.要對FileItem進行上傳操作,首先要判斷isFormField() 為false,因為系統將每個表單項解析成一個FileItem,這其中也包括不是文件上傳的表單項。所以要判 斷是否為文件上傳表單項。
下面用Servlet簡單的實現文件上傳:
upload.jsp
Java代碼
<body>
<form method="post" id="uploadForm" action="UploadServlet" enctype="multipart/form-data" >
<table style="border: 1px solid;" align="center">
<thead>
<tr>
<td style="text-align: center" colspan="2">文件上傳</td>
</tr>
</thead>
<tbody>
<tr>
<td>用戶 名:</td>
<td><input type="text" name="user.username"></input></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="user.password"></input></td>
</tr>
<tr>
<td colspan="2">
<input type="file" name="file1"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="file" name="file2"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="file" name="file3"/>
</td>
</tr>
<tr>
<td><input type="button" value="Login" id="upload"/></td>
<td><input type="button" value="Cancel" id="cancelUpload"/></td>
</tr>
</tbody>
</table>
</form>
</body>
UploadServlet
Java代碼
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 設置臨時緩存大小,文件大於這個值的部分保存到臨時目錄
factory.setSizeThreshold(1024 * 128);
//設置文件保存臨時目錄
factory.setRepository(new File(
"C:\\Documents and Settings\\bond\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
// 設置上傳內容大小
upload.setSizeMax(1024 * 1024*512);
List fileItems = upload.parseRequest(request);
for (FileItem fi : fileItems) {
if (! fi.isFormField()) {
fi
.write(new File("D:\\bond\\upload", fi
.getName ()));
}
}
request.getRequestDispatcher("success.jsp").forward(request,
response);
} catch (Exception e) {
e.printStackTrace();
request.getRequestDispatcher("failure.jsp").forward(request,
response);
}