檔案上傳 含進度條(fileupload控制元件)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">之前的專案一直沒有涉及到達的檔案上傳,所以沒有用到進度條,這幾天不忙,所以想把這個功能實現一下,我用的的fileupload的上傳控制元件,在網上查了一下,基本也都用這個,它可以上傳一個或者多個檔案。</span>
fileupload將獲取的表單內容分為了多個fileitem,fileitem大致分為兩類,formfeild和非formfield.
主要是formfield的操作.這時的form定義entype 為enctype="multipart/form-data"。
resp.setContentType("text/html;charset=UTF-8");
//設定處理請求的編碼方式
req.setCharacterEncoding("UTF-8");
PrintWriter pw = resp.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(2048*1024);
這裡request.setCharacterEncoding()是設定檔案上傳的編碼方式,如果不設定這個,上傳檔名為漢字的將顯示亂碼。
DIskFileItemFactory是生成servletFileUpload的前提,這是工廠模式的,
factory.setSizeThreshold(2048*1024);設定檔案上傳時快取區的大小,當快取區滿了以後檔案江北上傳到記憶體中。
ServletFileUpload upload = new ServletFileUpload(factory);
myProgressListener getBarListener = new myProgressListener(req);
upload.setProgressListener(getBarListener);//上傳大的檔案就需要進度條的顯示,這裡是給物件新增監聽器
註冊了監聽器後,檔案上傳中,監聽器會時時偵聽物件的上傳情況,為了繪製進度條,這裡將偵聽到的情況放在session中,然後ajax開啟另一個servelt每秒去獲取一次session,並且將session中的物件以json形式返回到前端繪製進度條。
說這麼多直接上原始碼
public class myProgressListener implements ProgressListener {
private HttpSession session;
public myProgressListener(HttpServletRequest req) {
session=req.getSession();
fileUploadStatus status = new fileUploadStatus();
session.setAttribute("status", status);
}
/* pBytesRead 到目前為止讀取檔案的位元數
* pContentLength 檔案總大小
* pItems 目前正在讀取第幾個檔案
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
// TODO Auto-generated method stub
fileUploadStatus status = (fileUploadStatus) session.getAttribute("status");
status.setPBytesRead(pBytesRead);
status.setPContentLength(pContentLength);
status.setPItems(pItems);
}
uolpadServlet
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
//設定處理請求的編碼方式
req.setCharacterEncoding("UTF-8");
PrintWriter pw = resp.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(2048*1024);
myProgressListener getBarListener = new myProgressListener(req);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(getBarListener);
//upload.setHeaderEncoding("UTF-8");
try {
List formList = upload.parseRequest(req);
Iterator<Object> formItem = formList.iterator();
// 將進度監聽器載入進去
while (formItem.hasNext()) {
FileItem item = (FileItem) formItem.next();
if (item.isFormField()) {
System.out.println("處理表單內容 ...");
//System.out.println("處理表單內容 ...");
processFormField(item, pw);
//System.out.println("Field Name:" + item.getFieldName());
} else {
System.out.println("處理上傳的檔案 ...");
// 此時的檔名包含了完整的路徑,得注意加工一下
String fileName = item.getName().substring(item.getName().lastIndexOf("\\")+1);
File file = new File("d:\\temp"
+ "\\" + fileName);
System.out.println("d:\\temp"
+ "\\" + fileName);
//if(new File(fileName).exists()){
OutputStream out = item.getOutputStream();
InputStream in = item.getInputStream();
req.getSession().setAttribute("outPutStream", out);
req.getSession().setAttribute("inPutStream", in);
item.write(file);
pw.println(fileName + " 檔案儲存完畢 ...");
pw.println("檔案大小為 :" + item.getSize() + "\r\n");
/*}else{
System.out.println("該檔案已經存在,請重新上傳");
}*/
}
}
} catch (FileUploadException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 處理表單內容
private void processFormField(FileItem item, PrintWriter pw)
throws Exception
{
String name = item.getFieldName();
String value = item.getString();
pw.println(name + " : " + value + "\r\n");
}
progreeServlet
public void doPost(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
fileUploadStatus status = (fileUploadStatus) session.getAttribute("status");
try {
response.reset();
response.getWriter().write("{\"pBytesRead\":"
+status.getPBytesRead()+",\"pContentLength\":"+status.getPContentLength()+"}");
System.out.println("{\"pBytesRead\":"
+status.getPBytesRead()+",\"pContentLength\":"+status.getPContentLength()+"}");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
this.doPost(request,response);
}
}
List formList = upload.parseRequest(req);//fileupload物件解析請求頭。
用這個控制元件上傳檔案,頭設定enctype="multipart/form-data",提交後,檔案物件資訊會跟在請求投中每個fileitem分開。
Iterator<Object> formItem = formList.iterator();