1. 程式人生 > >檔案上傳 含進度條(fileupload控制元件)

檔案上傳 含進度條(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();