亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2007年05月19日 00:00:00   作者:  
    <u id="z0b9q"><optgroup id="z0b9q"></optgroup></u>
    1.引言
    2.實(shí)現(xiàn)代碼
    2.1.服務(wù)器端代碼
    2.1.1. 文件上傳狀態(tài)類(FileUploadStatus)
    2.1.2. 文件上傳狀態(tài)偵聽(tīng)類(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é)語(yǔ)

     1. 引言

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

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

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

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

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

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

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

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

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

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

    /**
     * 本例程演示了通過(guò)Web上傳文件過(guò)程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。
     * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。
     *
     * 作者: 劉作晨
     * 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)前上傳文件號(hào)
      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)偵聽(tīng)類(FileUploadListener)

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

    /**
     * 本例程演示了通過(guò)Web上傳文件過(guò)程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。
     * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。
     *
     * 作者: 劉作晨
     * 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īng)顟B(tài)
    	 */
    	public void update(long pBytesRead, long pContentLength, int pItems){
    		FileUploadStatus statusBean= BackGroundService.getStatusBean(request);
    		statusBean.setUploadTotalSize(pContentLength);
    		//讀取完成
    	  if (pContentLength == -1) {
    	    statusBean.setStatus("完成對(duì)" + 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)的異常問(wèn)題解決

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

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

      ajax無(wú)刷新評(píng)論功能

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

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

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

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

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

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

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

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

      0 - (未初始化)還沒(méi)有調(diào)用send()方法 1 - (載入)已調(diào)用send()方法,正在發(fā)送請(qǐng)求 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ù)提交可以通過(guò)在服務(wù)器端加載方法或直接寫(xiě)在頁(yè)面腳本里,具體實(shí)現(xiàn)如下,遇到重復(fù)提交情況的朋友可以參考下,希望對(duì)大家有所幫助
      2013-07-07
    • Ajax 對(duì)象 包含post和get兩種異步傳輸方式

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

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

      Ajax基礎(chǔ)使用詳解

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

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

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

    最新評(píng)論

    <blockquote id="z0b9q"></blockquote>

            <acronym id="z0b9q"><cite id="z0b9q"><ol id="z0b9q"></ol></cite></acronym>