欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AJAX和JSP實(shí)現(xiàn)的基于WEB的文件上傳的進(jìn)度控制代碼第1/2頁

 更新時(shí)間:2007年05月19日 00:00:00   作者:  
<nobr id="ryzyt"></nobr>
<samp id="ryzyt"><delect id="ryzyt"></delect></samp>

        1.引言
        2.實(shí)現(xiàn)代碼
        2.1.服務(wù)器端代碼
        2.1.1. 文件上傳狀態(tài)類(FileUploadStatus)
        2.1.2. 文件上傳狀態(tài)偵聽類(FileUploadListener)
        2.1.3. 后臺(tái)服務(wù)類(BackGroundService)
        2.1.4. 文件上傳狀態(tài)控制類(BeanControler)
        2.2. 客戶端代碼
        2.2.1. AjaxWrapper.js
        2.2.2. fileUpload.html
        2.2.3. result.jsp
        2.2.4. fileUpload.css
        2.3. 配置文件
        3. 結(jié)語

         1. 引言

           基于瀏覽器的文件上傳,特別是對于通過<input type="file">標(biāo)簽來實(shí)現(xiàn)上傳的情況, 存在著嚴(yán)重的性能問題,因?yàn)橛脩籼峤涣宋募?,在瀏覽器把文件上傳到服務(wù)器的過程中,界面看上去似乎是靜止的,如果是小文件還好些,如果不幸需要上傳的是幾兆、幾十兆甚至上百兆的文件,我相信那是一種非常痛苦的體驗(yàn),我們中間的很多人應(yīng)該都有過此種不堪的經(jīng)歷。(一笑)

          現(xiàn)在我就針對這個(gè)問題給出一個(gè)解決方案,我們將實(shí)現(xiàn)一個(gè)具有監(jiān)控能力的WEB上傳的程序——它不僅把文件上傳到服務(wù)器,而且"實(shí)時(shí)地"監(jiān)視文件上傳的實(shí)際過程。

        解決方案的基本思路是這樣的:

        •   在Form提交上傳文件同時(shí),使用AJAX周期性地從Servlet輪詢上傳狀態(tài)信息
        •   然后,根據(jù)此信息更新進(jìn)度條和相關(guān)文字,及時(shí)反映文件傳輸狀態(tài)
        •   如果用戶取消上傳操作,則進(jìn)行相應(yīng)的現(xiàn)場清理工作:刪除已經(jīng)上傳的文件,在Form提交頁面中顯示相關(guān)信息
        •   如果上傳完畢,顯示已經(jīng)上傳的文件內(nèi)容(或鏈接)

        在介紹源代碼之前,我們先來看看程序運(yùn)行界面:

         2. 實(shí)現(xiàn)代碼

           實(shí)現(xiàn)代碼想當(dāng)然的有服務(wù)器端代碼和客戶端代碼(呵呵),我們先從服務(wù)器端開始。

         2.1. 服務(wù)器端代碼

          2.1.1. 文件上傳狀態(tài)類(FileUploadStatus)

           使用FileUploadStatus這個(gè)類記錄文件上傳狀態(tài),并將其作為服務(wù)器端與web客戶端之間通信的媒介,通過對這個(gè)類對象提供上傳狀態(tài)作為服務(wù)器回應(yīng)發(fā)送給web客戶端, web客戶端使用JavaScript獲得文件上傳狀態(tài)。源代碼如下:

        /**
         * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。
         * 如果需要轉(zhuǎn)載本例程,請您注明作者。
         *
         * 作者: 劉作晨
         * EMail:liuzuochen@gmail.com
         */
        package liuzuochen.sample.upload;
        import java.util.*;
        public class FileUploadStatus {
          //上傳用戶地址
          private String uploadAddr;
          //上傳總量
          private long uploadTotalSize = 0;
          //讀取上傳總量
          private long readTotalSize = 0;
          //當(dāng)前上傳文件號
          private int currentUploadFileNum = 0;
          //成功讀取上傳文件數(shù)
          private int successUploadFileCount = 0;
          //狀態(tài)
          private String status = "";
          //處理起始時(shí)間
          private long processStartTime = 0l;
          //處理終止時(shí)間
          private long processEndTime = 0l;
          //處理執(zhí)行時(shí)間
          private long processRunningTime = 0l;
          //上傳文件URL列表
          private List uploadFileUrlList = new ArrayList();
          //取消上傳
          private boolean cancel = false;
          //上傳base目錄
          private String baseDir = "";
          public FileUploadStatus() {
          }
          public String getBaseDir() {
            return baseDir;
          }
          public void setBaseDir(String baseDir) {
            this.baseDir = baseDir;
          }
          public boolean getCancel() {
            return cancel;
          }
          public void setCancel(boolean cancel) {
            this.cancel = cancel;
          }
          public List getUploadFileUrlList() {
            return uploadFileUrlList;
          }
          public void setUploadFileUrlList(List uploadFileUrlList) {
            this.uploadFileUrlList = uploadFileUrlList;
          }
          public long getProcessRunningTime() {
            return processRunningTime;
          }
          public void setProcessRunningTime(long processRunningTime) {
            this.processRunningTime = processRunningTime;
          }
          public long getProcessEndTime() {
            return processEndTime;
          }
          public void setProcessEndTime(long processEndTime) {
            this.processEndTime = processEndTime;
          }
          public long getProcessStartTime() {
            return processStartTime;
          }
          public void setProcessStartTime(long processStartTime) {
            this.processStartTime = processStartTime;
          }
          public long getReadTotalSize() {
            return readTotalSize;
          }
          public void setReadTotalSize(long readTotalSize) {
            this.readTotalSize = readTotalSize;
          }
          public int getSuccessUploadFileCount() {
            return successUploadFileCount;
          }
          public void setSuccessUploadFileCount(int successUploadFileCount) {
            this.successUploadFileCount = successUploadFileCount;
          }
          public int getCurrentUploadFileNum() {
            return currentUploadFileNum;
          }
          public void setCurrentUploadFileNum(int currentUploadFileNum) {
            this.currentUploadFileNum = currentUploadFileNum;
          }
          public String getStatus() {
            return status;
          }
          public void setStatus(String status) {
            this.status = status;
          }
          public long getUploadTotalSize() {
            return uploadTotalSize;
          }
          public String getUploadAddr() {
            return uploadAddr;
          }
          public void setUploadTotalSize(long uploadTotalSize) {
            this.uploadTotalSize = uploadTotalSize;
          }
          public void setUploadAddr(String uploadAddr) {
            this.uploadAddr = uploadAddr;
          }
          public String toJSon() {
            StringBuffer strJSon = new StringBuffer();
            strJSon.append("{UploadTotalSize:").append(getUploadTotalSize()).append(
                ",")
                .append("ReadTotalSize:").append(getReadTotalSize()).append(",")
                .append("CurrentUploadFileNum:").append(getCurrentUploadFileNum()).
                append(",")
                .append("SuccessUploadFileCount:").append(
                    getSuccessUploadFileCount()).append(",")
                .append("Status:'").append(getStatus()).append("',")
                .append("ProcessStartTime:").append(getProcessStartTime()).
                append(",")
                .append("ProcessEndTime:").append(getProcessEndTime()).append(
                    ",")
                .append("ProcessRunningTime:").append(getProcessRunningTime()).
                append(",")
                .append("Cancel:").append(getCancel()).append("}");
            return strJSon.toString();
          }
        }
        

          2.1.2. 文件上傳狀態(tài)偵聽類(FileUploadListener)

           使用Common-FileUpload 1.2版本(20070103)。此版本提供了能夠監(jiān)視文件上傳情況的ProcessListener接口,使開發(fā)者通過FileUploadBase類對象的setProcessListener方法植入自己的Listener。 FileUploadListener類實(shí)現(xiàn)了ProcessListener,在整個(gè)文件上傳過程中,它對上傳進(jìn)度進(jìn)行監(jiān)控,并且根據(jù)上傳 情況實(shí)時(shí)的更新上傳狀態(tài)Bean。源代碼如下:

        /**
         * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。
         * 如果需要轉(zhuǎn)載本例程,請您注明作者。
         *
         * 作者: 劉作晨
         * EMail:liuzuochen@gmail.com
         */
        package liuzuochen.sample.upload;
        import org.apache.commons.fileupload.ProgressListener;
        import javax.servlet.http.HttpServletRequest;
        public class FileUploadListener implements ProgressListener{
        	private HttpServletRequest request=null;
        	public FileUploadListener(HttpServletRequest request){
        		this.request=request;
        	}
        	/**
        	 * 更新狀態(tài)
        	 */
        	public void update(long pBytesRead, long pContentLength, int pItems){
        		FileUploadStatus statusBean= BackGroundService.getStatusBean(request);
        		statusBean.setUploadTotalSize(pContentLength);
        		//讀取完成
        	  if (pContentLength == -1) {
        	    statusBean.setStatus("完成對" + pItems +"個(gè)文件的讀取:讀取了 " + pBytesRead + " bytes.");
        	    statusBean.setReadTotalSize(pBytesRead);
        	    statusBean.setSuccessUploadFileCount(pItems);
        	    statusBean.setProcessEndTime(System.currentTimeMillis());
        	    statusBean.setProcessRunningTime(statusBean.getProcessEndTime());
        	  //讀取中
        	  } else {
        	    statusBean.setStatus("當(dāng)前正在處理第" + pItems +"個(gè)文件:已經(jīng)讀取了 " + pBytesRead + 
        "/" + pContentLength+ " bytes."); statusBean.setReadTotalSize(pBytesRead); statusBean.setCurrentUploadFileNum(pItems); statusBean.setProcessRunningTime(System.currentTimeMillis()); } BackGroundService.saveStatusBean(request,statusBean); } }

        相關(guān)文章

        • 有關(guān)ajax的error與后臺(tái)的異常問題解決

          有關(guān)ajax的error與后臺(tái)的異常問題解決

          這篇文章主要介紹了關(guān)于ajax的error與后臺(tái)的異常,需要的朋友可以參考下
          2014-02-02
        • ajax無刷新評論功能

          ajax無刷新評論功能

          這篇文章主要為大家詳細(xì)介紹了ajax無刷新評論功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
          2017-02-02
        • 如何創(chuàng)建ajax對象并兼容多個(gè)瀏覽器

          如何創(chuàng)建ajax對象并兼容多個(gè)瀏覽器

          這篇文章主要介紹了創(chuàng)建ajax對象并兼容多個(gè)瀏覽器方法簡單記錄,在某些情況下還是比較實(shí)用的,需要的朋友可以參考下
          2014-08-08
        • 通過Ajax進(jìn)行Post提交Json數(shù)據(jù)的方法

          通過Ajax進(jìn)行Post提交Json數(shù)據(jù)的方法

          下面小編就為大家分享一篇通過Ajax進(jìn)行Post提交Json數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
          2018-03-03
        • Ajax學(xué)習(xí)筆記整理

          Ajax學(xué)習(xí)筆記整理

          Ajax: Asynchronous JavaScript and Xml , 異步j(luò)s腳本和xml , 常用來實(shí)現(xiàn)頁面局部的異步刷新, 對提高用戶體驗(yàn)有很大幫助. Xml在多語言時(shí)較有優(yōu)勢, 但Ajax技術(shù)實(shí)際上較多采用Json對象而不是Xml來處理數(shù)據(jù)
          2016-01-01
        • ajax readyState的五種狀態(tài)詳解

          ajax readyState的五種狀態(tài)詳解

          0 - (未初始化)還沒有調(diào)用send()方法 1 - (載入)已調(diào)用send()方法,正在發(fā)送請求 2 - (載入完成)send()方法執(zhí)行完成,已經(jīng)接收到全部響應(yīng)內(nèi)容 3 - (交互)正在解析響應(yīng)內(nèi)容 4 - (完成)響應(yīng)內(nèi)容解析完成,可以在客戶端調(diào)用了
          2008-12-12
        • ajax 防止用戶反復(fù)提交的2種解決方案

          ajax 防止用戶反復(fù)提交的2種解決方案

          ajax 防止重復(fù)提交可以通過在服務(wù)器端加載方法或直接寫在頁面腳本里,具體實(shí)現(xiàn)如下,遇到重復(fù)提交情況的朋友可以參考下,希望對大家有所幫助
          2013-07-07
        • Ajax 對象 包含post和get兩種異步傳輸方式

          Ajax 對象 包含post和get兩種異步傳輸方式

          Ajax對象接受一個(gè)對象字面量為參數(shù),這個(gè)對象字面量中包含method,url,success,params,fail參數(shù)
          2009-07-07
        • Ajax基礎(chǔ)使用詳解

          Ajax基礎(chǔ)使用詳解

          這篇文章主要介紹了Ajax基礎(chǔ)使用詳解,是前后臺(tái)交互的能? 也就是我們客戶端給服務(wù)端發(fā)送消息的?具,以及接受響應(yīng)的?具,本篇就來對ajax基礎(chǔ)進(jìn)行詳細(xì)講解,需要的朋友可以參考下
          2023-05-05
        • ajax結(jié)合mysql數(shù)據(jù)庫和smarty實(shí)現(xiàn)局部數(shù)據(jù)狀態(tài)的刷新方法

          ajax結(jié)合mysql數(shù)據(jù)庫和smarty實(shí)現(xiàn)局部數(shù)據(jù)狀態(tài)的刷新方法

          下面小編就為大家分享一篇ajax結(jié)合mysql數(shù)據(jù)庫和smarty實(shí)現(xiàn)局部數(shù)據(jù)狀態(tài)的刷新方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
          2017-12-12

        最新評論