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

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

 更新時(shí)間:2007年05月19日 00:00:00   作者:  
1.引言
2.實(shí)現(xiàn)代碼
2.1.服務(wù)器端代碼
2.1.1. 文件上傳狀態(tài)類(lèi)(FileUploadStatus)
2.1.2. 文件上傳狀態(tài)偵聽(tīng)類(lèi)(FileUploadListener)
2.1.3. 后臺(tái)服務(wù)類(lèi)(BackGroundService)
2.1.4. 文件上傳狀態(tài)控制類(lè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)類(lèi)(FileUploadStatus)

   使用FileUploadStatus這個(gè)類(lèi)記錄文件上傳狀態(tài),并將其作為服務(wù)器端與web客戶端之間通信的媒介,通過(guò)對(duì)這個(gè)類(lèi)對(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)類(lèi)(FileUploadListener)

   使用Common-FileUpload 1.2版本(20070103)。此版本提供了能夠監(jiān)視文件上傳情況的ProcessListener接口,使開(kāi)發(fā)者通過(guò)FileUploadBase類(lèi)對(duì)象的setProcessListener方法植入自己的Listener。 FileUploadListener類(lèi)實(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)論

    <form id="nj3t4"><optgroup id="nj3t4"><nav id="nj3t4"></nav></optgroup></form>