使用第三方元件實現上傳檔案
阿新 • • 發佈:2018-11-18
使用第三方元件實現上傳檔案功能需要在專案lib下目錄匯入兩個Jar包(commons-fileupload 和 commons-io)
commons-io下載地址:http://commons.apache.org/proper/commons-io/download_io.cgi
commons-fileupload下載地址:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
關鍵步驟:
- 在JSP檔案中使用page指令匯入Commons-FileUpload元件所需的類
- 判斷請求資訊中的內容是否是multipart型別,如果是則進行處理
- 通過FileItemFactory工廠物件例項化ServletFileUpload物件
- 呼叫ServletFileUpload物件的parseRequest()將表單中欄位解析成FileItem物件的集合
- 通過迭代依次處理每個FileItem物件,如果是普通欄位,通過getString()方法得到相應表單字元的值,該值與表單欄位中的"name"屬性對應,如果是檔案欄位,則通過File的構造方法構建一個指定路徑名和檔名的檔案,並通過FileItem物件的Write()的方法將上傳檔案的內容儲存到檔案中
示例程式碼:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="doindex.jsp" enctype="multipart/form-data" method="post"> 姓名:<input type="text" name="username"> <input type="file" name="filename"> <input type="submit" value="提交"> </form> </body> </html>
處理index.jsp請求的doindex.jsp頁面
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
request.setCharacterEncoding("utf-8");
String uploadFileName="";//上傳的檔名
String fieldName="";//表單欄位name的屬性值
//請求資訊中的內容是否是multipart型別
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
//上傳檔案的儲存路徑(伺服器檔案系統上的絕對檔案路徑)
String uploadFilePath=request.getSession().getServletContext().getRealPath("upload/");
if(isMultipart){
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
try{
List<FileItem> items=upload.parseRequest(request);
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()){
FileItem item=(FileItem)iter.next();
if(item.isFormField()){ //普通表單欄位
fieldName=item.getFieldName();
if(fieldName.equals("username")){
out.print(item.getString("utf-8")+"上傳了檔案!");
}
}else{ //檔案表單欄位
String fileName=item.getName();
if(fileName!=null && !fileName.equals("")){
File fullFile=new File(item.getName());
File saveFile=new File(uploadFilePath,fullFile.getName());
item.write(saveFile);
uploadFileName=fullFile.getName();
out.print("上傳成功後的檔名是:"+uploadFileName);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'doindex.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
</body>
</html>