標(biāo)簽和顯示百分比的
標(biāo)簽,關(guān)鍵代碼如下:
請選擇上傳的文件:
注:文件大小請控制在
50M
以內(nèi)。
0%
(
3
)新建上傳文件的
Servlet
實現(xiàn)類
UpLpad
。在該類中編寫實現(xiàn)文件上傳的方法
uploadFile()
,在該方法中通過
Common-FileUpload
組件實現(xiàn)分段上傳文件,并計算上傳百分比,實時保存到
Session
中,關(guān)鍵代碼如下:
public void uploadFile(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
request.setCharacterEncoding("GBK");
HttpSession session=request.getSession();
session.setAttribute("progressBar",0); //
定義指定上傳進(jìn)度的
Session
變量
String error = "";
int maxSize=50*1024*1024; //
單個上傳文件大小的上限
DiskFileItemFactory factory = new DiskFileItemFactory(); //
創(chuàng)建工廠對象
ServletFileUpload upload = new ServletFileUpload(factory); //
創(chuàng)建一個新的文件上傳對象
try {
List items = upload.parseRequest(request); //
解析上傳請求
Iterator itr = items.iterator(); //
枚舉方法
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next(); //
獲取
FileItem
對象
if (!item.isFormField()) { //
判斷是否為文件域
if (item.getName() != null && !item.getName().equals("")) {//
是否選擇了文件
long upFileSize=item.getSize(); //
上傳文件的大小
String fileName=item.getName(); //
獲取文件名
if(upFileSize>maxSize){
error="
您上傳的文件太大,請選擇不超過
50M
的文件
";
break;
}
//
此時文件暫存在服務(wù)器的內(nèi)存中
File tempFile = new File(fileName); //
構(gòu)造文件目錄臨時對象
String uploadPath = this.getServletContext().getRealPath("/upload");
File file = new File(uploadPath,tempFile.getName());
InputStream is=item.getInputStream();
int buffer=1024; //
定義緩沖區(qū)的大小
int length=0;
byte[] b=new byte[buffer];
double percent=0;
FileOutputStream fos=new FileOutputStream(file);
while((length=is.read(b))!=-1){
percent+=length/(double)upFileSize*100D; //
計算上傳文件的百分比
fos.write(b,0,length); //
向文件輸出流寫讀取的數(shù)據(jù)
session.setAttribute("progressBar",Math.round(percent));
}
fos.close();
Thread.sleep(1000); //
線程休眠
1
秒
} else {
error="
沒有選擇上傳文件!
";
}
}
}
} catch (Exception e) {
e.printStackTrace();
error = "
上傳文件出現(xiàn)錯誤:
" + e.getMessage();
}
if (!"".equals(error)) {
request.setAttribute("error", error);
request.getRequestDispatcher("error.jsp").forward(request, response);
}else {
request.setAttribute("result", "
文件上傳成功!
");
request.getRequestDispatcher("upFile_deal.jsp").forward(request, response);
}
}
(
4
)在文件上傳頁
index.jsp
中,導(dǎo)入編寫的
Ajax
請求方法的
request.js
文件,并編寫獲取上傳進(jìn)度的
Ajax
請求方法和
Ajax
回調(diào)函數(shù),關(guān)鍵代碼如下:
(
5
)編寫
showProgress.jsp
頁面,在該頁中應(yīng)用
EL
表達(dá)式輸出保存在
session
域中的上傳進(jìn)度條的值,具體代碼如下:
<%@page contentType="text/html" pageEncoding="GBK"%>
${progressBar}
(
6
)編寫表單提交按鈕
onclick
事件所調(diào)用的
JavaScript
方法,在該方法通過
window
對象的
setInterval()
方法每隔一定時間請求一次服務(wù)器,獲得最新的上傳進(jìn)度,關(guān)鍵代碼如下:
function deal(form){
form.submit(); //
提交表單
timer=window.setInterval("getProgress()",500); //
每隔
500
毫秒獲取一次上傳進(jìn)度
}
原文來自:
柯南&
的博客