************本人水平有限,在學習時請用批判的態度學習,有問題給我留言************
說詳解有點沒有底氣了,這是講文件上傳時的一個例子,我把每一行代碼的註釋都寫了出來,加強理解,熟悉api。
我把上傳文件功能放到了一個工程裏,前臺有一個index.jsp頁面,一個success.jsp頁面
一個js目錄、一個css文件
需要apache commons-fileupload包
commons-io包
前臺還有個js的小例子,模擬軟鍵盤,例子不是原創,只是爲了美化前臺。
工程下載地址:http://download.csdn.net/source/1458143
廢話不多說了,上代碼!!
下面的是核心的servlet
package cn.itcast.upload;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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;
/**
* 文件上傳 servlet
* 詳盡註釋每一步做法和含義,方便大家學習
*
* @version 1.0
* @author caohua
* @company 傳智博客
*/
public class FileUploadServlet extends HttpServlet {
/**
* 序列化servlet,防止鈍化後無法恢復的問題
*/
private static final long serialVersionUID = 1L;
public FileUploadServlet() {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");//設置返回頭信息
PrintWriter out = response.getWriter();//返回的輸出
String path = getServletContext().getRealPath("/upload");//得到該應用下的upload目錄在服務器上的絕對路徑
if( path == null ){//如果爲空表示不能訪問,可能是系統設置了訪問權限
out.print("無法訪問該目錄!");
return;
}
File uploadDir = new File(path);//得到該目錄的文件對象
if(!uploadDir.exists()){//判斷該目錄是否存在
if(!uploadDir.mkdir()){//如果不存在就建立該目錄
out.print("無法創建該目錄!");//如果建立失敗,給出提示
return;
}
}
if(!ServletFileUpload.isMultipartContent(request)){//用 ServletFileUpload 類的靜態方法 isMultipartContent 判斷 request 是否是 multipart/form-data 類型
out.print("只能 multipart/form-data 類型數據");
return;
}
//創建 DiskFileItemFactory 對象
DiskFileItemFactory factory = new DiskFileItemFactory();
//factory.setRepository(tempDir);可以設置緩存目錄
factory.setSizeThreshold(1024 * 1024);//超過1m的數據採用臨時文件緩存
ServletFileUpload upload = new ServletFileUpload(factory);//創建 ServletFileUpload 對象,構造的時候傳一個 DiskFileItemFactory 對象進去
upload.setFileSizeMax(1024 * 1024 * 2);//單個文件大小
upload.setHeaderEncoding("gb2312");//設置普通字段名稱和文件字段的文件名所採用的字符集編碼
upload.setSizeMax(1024 * 1024 * 4);//最多上傳2m的文件
List list = null;
try {
list = upload.parseRequest(request);//解析 request 對象 得到一個包含 FileItem 對象的 list
} catch (FileUploadException e) {
out.print("解析文件時出現問題:");
e.printStackTrace();
return;
}
Iterator it = list.iterator();//遍歷list
while(it.hasNext()){
FileItem fi = (FileItem)it.next();//類型轉換
if(fi.isFormField()){//判斷該 FileItem 對象是否是一個普通表單類型
String name = fi.getFieldName();//得到普通表單類型的表單名
String content = fi.getString("GB2312");//用指定編碼得到普通表單的值
request.setAttribute(name, content);//把鍵值放入 request 對象
}else{
try{
String pathStr = fi.getName();//得到文件表單的值,就是用戶本地的文件路徑
//如果文件表單爲空,則不處理
if(pathStr.trim().equals("")){
continue;
}
int start = pathStr.lastIndexOf("//");//得到文件名在路徑中的位置
String fileName = pathStr.substring(start + 1);//得到文件名
File pathDest = new File( path , fileName );//創建上傳上來的文件對象 由服務器上存放文件的路徑 + 文件名 組成
fi.write(pathDest);//寫文件
String name = fi.getFieldName();//得到文件表單的名稱
request.setAttribute(name, fileName);//把表單名、文件名放入 request
}catch(Exception e){
out.print("存儲文件錯誤:");
e.printStackTrace();
return;
}
finally{//立即刪除保存表單字段內容的臨時文件
fi.delete();
}
}
}
StringBuffer filelist = new StringBuffer();//得到可變字符串對象
//把上傳的文件名拼裝到可變字符串中
String file1 = (String)request.getAttribute("file1");
makeUplist(filelist, file1);
String file2 = (String)request.getAttribute("file2");
makeUplist(filelist, file2);
request.setAttribute("list", filelist);//把文件名的字符串放入 request
request.getRequestDispatcher("success.jsp").forward(request, response);//請求轉發到指定頁面
}
/**
* 將 str 追加到 sb中,以“,”隔開
* @param sb
* @param str
*/
private void makeUplist(StringBuffer sb ,String str){
if(str != null){//追加的字符串爲空則不做任何操作
if(sb.length() != 0){//如果可變字符串長度不爲0,需要用“,”隔開
sb.append(",");
}
sb.append(str);//追加字符串
}
}
public void init() throws ServletException {
}
}
下面是index.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>傳智博客---文件上傳</title>
<style type="text/css">
body {
font-size: 100%;
font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif;
padding-top: 100px;
}
label { display: block; margin-top: 10px; }
#login { width: 300px; margin: 0 auto; border: 1px solid #eee; padding: 25px; background-color: #FFFFCC; }
a { color: #0066CC; text-decoration: none; border-bottom: 1px dotted #0066cc; }
#submit_butt { margin-top: 15px; }
h3 { margin-top: 0; }
</style>
<link href="keyboardstyle.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div id="login">
<h3>文件上傳</h3>
<form action="fileupload" method="post" enctype="multipart/form-data">
<label for="username">用戶名:</label>
<input type="text" name="name" id="username" />
<label for="pwd">密碼:</label>
<input type="text" name="password" id="pwd"/>
<a href="#" id="showkeyboard" title="Type in your password using a virtual keyboard.">鍵盤</a> <br />
<label for="pwd">文件1:</label>
<input type="file" name="file1" />
<label for="pwd">文件2:</label>
<input type="file" name="file2" />
<br>
<input type="submit" name="Submit" id="submit_butt" value="提交" />
</form>
<div id="keyboard">
<div id="row0">
<input name="accent" type="button" value="`" />
<input name="1" type="button" value="1" />
<input name="2" type="button" value="2" />
<input name="3" type="button" value="3" />
<input name="4" type="button" value="4" />
<input name="5" type="button" value="5" />
<input name="6" type="button" value="6" />
<input name="7" type="button" value="7" />
<input name="8" type="button" value="8" />
<input name="9" type="button" value="9" />
<input name="0" type="button" value="0" />
<input name="-" type="button" value="-" />
<input name="=" type="button" value="=" />
<input name="backspace" type="button" value="Backspace" />
</div>
<div id="row0_shift">
<input name="tilde" type="button" value="~" />
<input name="exc" type="button" value="!" />
<input name="at" type="button" value="@" />
<input name="hash" type="button" value="#" />
<input name="dollar" type="button" value="$" />
<input name="percent" type="button" value="%" />
<input name="caret" type="button" value="^" />
<input name="ampersand" type="button" value="&" />
<input name="asterik" type="button" value="*" />
<input name="openbracket" type="button" value="(" />
<input name="closebracket" type="button" value=")" />
<input name="underscore" type="button" value="_" />
<input name="plus" type="button" value="+" />
<input name="backspace" type="button" value="Backspace" />
</div>
<div id="row1">
<input name="q" type="button" value="q" />
<input name="w" type="button" value="w" />
<input name="e" type="button" value="e" />
<input name="r" type="button" value="r" />
<input name="t" type="button" value="t" />
<input name="y" type="button" value="y" />
<input name="u" type="button" value="u" />
<input name="i" type="button" value="i" />
<input name="o" type="button" value="o" />
<input name="p" type="button" value="p" />
<input name="[" type="button" value="[" />
<input name="]" type="button" value="]" />
<input name="/" type="button" value="/" />
</div>
<div id="row1_shift">
<input name="Q" type="button" value="Q" />
<input name="W" type="button" value="W" />
<input name="E" type="button" value="E" />
<input name="R" type="button" value="R" />
<input name="T" type="button" value="T" />
<input name="Y" type="button" value="Y" />
<input name="U" type="button" value="U" />
<input name="I" type="button" value="I" />
<input name="O" type="button" value="O" />
<input name="P" type="button" value="P" />
<input name="{" type="button" value="{" />
<input name="}" type="button" value="}" />
<input name="|" type="button" value="|" />
</div>
<div id="row2">
<input name="a" type="button" value="a" />
<input name="s" type="button" value="s" />
<input name="d" type="button" value="d" />
<input name="f" type="button" value="f" />
<input name="g" type="button" value="g" />
<input name="h" type="button" value="h" />
<input name="j" type="button" value="j" />
<input name="k" type="button" value="k" />
<input name="l" type="button" value="l" />
<input name=";" type="button" value=";" />
<input name="'" type="button" value="'" />
</div>
<div id="row2_shift">
<input name="a" type="button" value="A" />
<input name="s" type="button" value="S" />
<input name="d" type="button" value="D" />
<input name="f" type="button" value="F" />
<input name="g" type="button" value="G" />
<input name="h" type="button" value="H" />
<input name="j" type="button" value="J" />
<input name="k" type="button" value="K" />
<input name="l" type="button" value="L" />
<input name=";" type="button" value=":" />
<input name="'" type="button" value='"' />
</div>
<div id="row3">
<input name="Shift" type="button" value="Shift" id="shift" />
<input name="z" type="button" value="z" />
<input name="x" type="button" value="x" />
<input name="c" type="button" value="c" />
<input name="v" type="button" value="v" />
<input name="b" type="button" value="b" />
<input name="n" type="button" value="n" />
<input name="m" type="button" value="m" />
<input name="," type="button" value="," />
<input name="." type="button" value="." />
<input name="/" type="button" value="/" />
</div>
<div id="row3_shift">
<input name="Shift" type="button" value="Shift" id="shifton" />
<input name="Z" type="button" value="Z" />
<input name="X" type="button" value="X" />
<input name="C" type="button" value="C" />
<input name="V" type="button" value="V" />
<input name="B" type="button" value="B" />
<input name="N" type="button" value="N" />
<input name="M" type="button" value="M" />
<input name="lt" type="button" value="<" />
<input name="gt" type="button" value=">" />
<input name="?" type="button" value="?" />
</div>
<div id="spacebar">
<input name="spacebar" type="button" value=" " />
</div>
</div>
</div>
<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-personalized-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-fieldselection.js"></script>
<script type="text/javascript" src="js/vkeyboard.js"></script>
</body>
</html>