ajaxjsp實(shí)現(xiàn)基于web的文件上傳的進(jìn)度控制說明書_第1頁
ajaxjsp實(shí)現(xiàn)基于web的文件上傳的進(jìn)度控制說明書_第2頁
ajaxjsp實(shí)現(xiàn)基于web的文件上傳的進(jìn)度控制說明書_第3頁
ajaxjsp實(shí)現(xiàn)基于web的文件上傳的進(jìn)度控制說明書_第4頁
ajaxjsp實(shí)現(xiàn)基于web的文件上傳的進(jìn)度控制說明書_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1.引言 基于瀏覽器的文件上傳,特別是對于通過標(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ù)此信息更新

2、進(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)類() 使用這個(gè)類記錄文件上傳狀態(tài),并將其作為服務(wù)器端與web客戶端之間通信的媒介,通過對這個(gè)類對象提供上傳狀態(tài)作為服務(wù)器回應(yīng)發(fā)送給web客戶端, web客戶端使用JavaScript獲得文件上傳狀態(tài)。源代碼如下:/* * 本例程演示

3、了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。 * 如果需要轉(zhuǎn)載本例程,請您注明作者。 * * 作者: 劉作晨 * EMail: */package liuzuochen.sample.upload;import java.util.*;public class /上傳用戶地址 private String uploadAddr; /上傳總量 private long uploadTotalSize = 0; /讀取上傳總量 private long readTotalSize = 0; /當(dāng)前上傳文件號(hào) private int currentUpload = 0;

4、/成功讀取上傳文件數(shù) private int successUpload = 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 upload = new ArrayList(); /取消上傳 private boolean cancel = false; /上傳base目

5、錄 private String baseDir = ; public () 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 getUpload() return upload; public void se

6、tUpload(List upload) this.upload = upload; public long getProcessRunningTime() return processRunningTime; public void setProcessRunningTime(long processRunningTime) cessRunningTime = processRunningTime; public long getProcessEndTime() return processEndTime; public void setProcessEndTime(long

7、 processEndTime) cessEndTime = processEndTime; public long getProcessStartTime() return processStartTime; public void setProcessStartTime(long processStartTime) cessStartTime = processStartTime; public long getReadTotalSize() return readTotalSize; public void setReadTotalSize(long re

8、adTotalSize) this.readTotalSize = readTotalSize; public int getSuccessUpload() return successUpload; public void setSuccessUpload(int successUpload) this.successUpload = successUpload; public int getCurrentUpload() return currentUpload; public void setCurrentUpload(int currentUpload) this.currentUpl

9、oad = currentUpload; 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

10、 = 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

11、(CurrentUpload:).append(getCurrentUpload(). append(,) .append(SuccessUpload:).append( getSuccessUpload().append(,) .append(Status:).append(getStatus().append(,) .append(ProcessStartTime:).append(getProcessStartTime(). append(,) .append(ProcessEndTime:).append(getProcessEndTime().append( ,) .append(P

12、rocessRunningTime:).append(getProcessRunningTime(). append(,) .append(Cancel:).append(getCancel().append(); return strJSon.toString(); 2.1.2.文件上傳狀態(tài)偵聽類() 使用Common- 1.2版本(20070103)。此版本提供了能夠監(jiān)視文件上傳情況的ProcessListener接口,使開發(fā)者通過類對象的setProcessListener方法植入自己的Listener。 類實(shí)現(xiàn)了ProcessListener,在整個(gè)文件上傳過程中,它對上傳進(jìn)度進(jìn)行監(jiān)控

13、,并且根據(jù)上傳 情況實(shí)時(shí)的更新上傳狀態(tài)Bean。源代碼如下:/* * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。 * 如果需要轉(zhuǎn)載本例程,請您注明作者。 * * 作者: 劉作晨 * EMail: */package liuzuochen.sample.upload;import mons.;import javax.servlet.http.HttpServletRequest;public class implements ProgressListenerprivate HttpServletRequest request=

14、null;public (HttpServletRequest request)this.request=request;/* * 更新狀態(tài) */public void update(long pBytesRead, long pContentLength, int pItems) statusBean= BackGroundService.getStatusBean(request);statusBean.setUploadTotalSize(pContentLength);/讀取完成 if (pContentLength = -1) statusBean.setStatus(完成對 + p

15、Items +個(gè)文件的讀取:讀取了 + pBytesRead + bytes.); statusBean.setReadTotalSize(pBytesRead); statusBean.setSuccessUpload(pItems); statusBean.setProcessEndTime(System.currentTimeMillis(); statusBean.setProcessRunningTime(statusBean.getProcessEndTime(); /讀取中 else statusBean.setStatus(當(dāng)前正在處理第 + pItems +個(gè)文件:已經(jīng)讀取了

16、 + pBytesRead + / + pContentLength+ bytes.); statusBean.setReadTotalSize(pBytesRead); statusBean.setCurrentUpload(pItems); statusBean.setProcessRunningTime(System.currentTimeMillis(); BackGroundService.saveStatusBean(request,statusBean);2.1.3.后臺(tái)服務(wù)類(BackGroundService) BackGroundService這個(gè)Servlet類負(fù)責(zé)接收F

17、orm Post數(shù)據(jù)、回應(yīng)狀態(tài)輪詢請求、處理取消文件上傳的請求。 盡管可以把這些功能相互分離開來,但為了簡單明了,還是將它們放到Servlet中,只是由不同的方法進(jìn)行分割。 源代碼如下:/* * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。 * 如果需要轉(zhuǎn)載本例程,請您注明作者。 * * 作者: 劉作晨 * EMail: */package liuzuochen.sample.upload;/* * Title: 后臺(tái)服務(wù) * * Description: 為客戶端提供上傳及文件傳輸狀態(tài)查詢服務(wù) * */import java.io.File;import

18、 java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.;import mons.;import mons.;import mons.*;public class BackGr

19、oundService extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet public static final String UPLOAD_DIR = /upload; public static final String DEFAULT_UPLOAD_FAILURE_URL = ./result.jsp; public BackGroundService() super(); protected void doGet(HttpServletRequest request, HttpServletR

20、esponse response) throws ServletException, IOException doPost(request, response); /* * 從文件路徑中取出文件名 */ private String takeOut(String ) int pos = (); if (pos 0) return (pos + 1); else return ; /* * 從request中取出 Bean */ public static getStatusBean( HttpServletRequest request) BeanControler beanCtrl = Be

21、anControler.getInstance(); return beanCtrl.getUploadStatus(request.getRemoteAddr(); /* * 把 Bean保存到類控制器BeanControler */ public static void saveStatusBean( HttpServletRequest request, statusBean) statusBean.setUploadAddr(request.getRemoteAddr(); BeanControler beanCtrl = BeanControler.getInstance(); be

22、anCtrl.setUploadStatus(statusBean); /* * 刪除已經(jīng)上傳的文件 */ private void deleteUploaded request) satusBean = getStatusBean(request); for (int i = 0; i satusBean.getUpload().size(); i+) = new (UPLOAD_DIR) + + satusBean.getUpload(). get(i); uploaded(); satusBean.getUpload().clear(); satusBean.setStatus(刪除已上

23、傳的文件); saveStatusBean(request, satusBean); /* * 上傳過程中出錯(cuò)處理 */ private void uploadExceptionHandle( HttpServletRequest request, String errMsg) throws ServletException, IOException /首先刪除已經(jīng)上傳的文件 deleteUploaded); satusBean = getStatusBean(request); satusBean.setStatus(errMsg); saveStatusBean(request, satu

24、sBean); /* * 初始化文件上傳狀態(tài)Bean */ private initStatusBean(HttpServletRequest request) satusBean = new (); satusBean.setStatus(正在準(zhǔn)備處理); satusBean.setUploadTotalSize(request.getContentLength(); satusBean.setProcessStartTime(System.currentTimeMillis(); satusBean.setBaseDir(request.getContextPath() + UPLOAD_

25、DIR); return satusBean; /* * 處理文件上傳 */ private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Disk factory = new Disk(); /設(shè)置內(nèi)存緩沖區(qū),超過后寫入臨時(shí)文件 factory.setSizeThreshold(10240000); /設(shè)置臨時(shí)文件存儲(chǔ)位置 factory.setRepository(new (/upload/temp); Servlet u

26、pload = new Servlet(factory); /設(shè)置單個(gè)文件的最大上傳值 upload.set(102400000); /設(shè)置整個(gè)request的最大值 upload.setSizeMax(102400000); upload.setProgressListener(new (request); /保存初始化后的 Bean saveStatusBean(request, initStatusBean(request); String forwardURL = ; try List items = upload.parseRequest(request); /獲得返回url for

27、 (int i = 0; i items.size(); i+) item = () items.get(i); if (item.isFormField() forwardURL = item.getString(); break; /處理文件上傳 for (int i = 0; i 0) String = takeOut(item.getName(); = new (UPLOAD_DIR) + + ); item.write(uploadedFile); /更新上傳文件列表 satusBean = getStatusBean(request); satusBean.getUpload().

28、add(); saveStatusBean(request, satusBean); Thread.sleep(500); catch ( e) uploadExceptionHandle(request, 上傳文件時(shí)發(fā)生錯(cuò)誤: + e.getMessage(); catch (Exception e) uploadExceptionHandle(request, 保存上傳文件時(shí)發(fā)生錯(cuò)誤: + e.getMessage(); if (forwardURL.length() = 0) forwardURL = DEFAULT_UPLOAD_FAILURE_URL; request.getRequ

29、estDispatcher(forwardURL).forward(request, response); /* * 回應(yīng)上傳狀態(tài)查詢 */ private void responseStatusQuery(HttpServletRequest request, HttpServletResponse response) throws IOException response.setContentType(text/xml); response.setHeader(Cache-Control, no-cache); satusBean = getStatusBean(request); res

30、ponse.getWriter().write(satusBean.toJSon(); /* * 處理取消文件上傳 */ private void processCancel(HttpServletRequest request, HttpServletResponse response) throws IOException satusBean = getStatusBean(request); satusBean.setCancel(true); saveStatusBean(request, satusBean); responseStatusQuery(request, respons

31、e); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException boolean isMultipart = Servlet(request); if (isMultipart) process(request, response); else request.setCharacterEncoding(UTF-8); if (request.getParameter(uploadStatus) != null) resp

32、onseStatusQuery(request, response); if (request.getParameter(cancelUpload) != null) processCancel(request, response); 2.1.4.文件上傳狀態(tài)控制類(BeanControler) 這是一個(gè)單例類,它的功能是為客戶端保存文件上傳狀態(tài),這里我沒有使用Session來存儲(chǔ)文件上傳狀態(tài),因?yàn)閷τ贏JAX這種異步調(diào)用,服務(wù)器會(huì)開啟不同的Session,所以無法通過Session保存文件上傳狀態(tài)。 我并不認(rèn)為這種方法最好,如果有更好的方法,歡迎大家一起討論。 源代碼如下:/* * 本例程演

33、示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對本例程進(jìn)行任何修改和使用。 * 如果需要轉(zhuǎn)載本例程,請您注明作者。 * * 作者: 劉作晨 * EMail: */package liuzuochen.sample.upload;/* * Title: 類控制器 * * Description: 主要作用是對進(jìn)行管理,為客戶端提供相應(yīng)的 * 類對象。這是一個(gè)單例類。 * */import java.util.Vector;public class BeanControler private static BeanControler beanControler = new BeanControle

34、r(); private Vector vector = new Vector(); private BeanControler() public static BeanControler getInstance() return beanControler; /* * 取得相應(yīng)類對象的存儲(chǔ)位置 */ private int indexOf(String strID) int nReturn = -1; for (int i = 0; i vector.size(); i+) status = () vector.elementAt(i); if (status.getUploadAddr()

35、.equals(strID) nReturn = i; break; return nReturn; /* * 取得相應(yīng)類對象 */ public getUploadStatus(String strID) return () vector.elementAt(indexOf(strID); /* * 存儲(chǔ)類對象 */ public void setUploadStatus( status) int nIndex = indexOf(status.getUploadAddr(); if ( -1 = nIndex) vector.add(status); else vector.insertE

36、lementAt(status, nIndex); vector.removeElementAt(nIndex + 1); /* * 刪除類對象 */ public void removeUploadStatus(String strID) int nIndex = indexOf(strID); if(-1!=nIndex) vector.removeElementAt(nIndex); 2.2.客戶端代碼 客戶端我們采用Prototype框架。請下載。2.2.1.AjaxWrapper.js AjaxWrapper.js對Prototype進(jìn)行了封裝。請下載分析2.2.2. 是文件上傳界面

37、。 請下載。 2.2.3.result.jsp result.jsp是文件上傳結(jié)果顯示界面。 請下載 2.2.4. 是樣式文件。 源代碼如下:body color:#000;background-color:white;font:15px Georgia, Lucida Grande, Arial, sans-serif; letter-spacing:0.01em;margin:15px;#controlPanel,#resultPanelwidth:700px;margin:20px auto;padding:25px;border:3px solid gray;-moz-border-r

38、adius:10px;background:#f8f8f8;#errorAreawidth:400px;margin:20px auto;padding:25px;border:3px solid gray;-moz-border-radius:10px;background:red;#normalMessageAreawidth:400px;margin:20px auto;padding:25px;border:3px solid gray;-moz-border-radius:10px;background:yellow;#progressBar padding-top: 5px; #t

39、otalProgressBarBox width: 350px; height: 20px; border: 1px inset; background: #eee;#totalProgressBarBoxContent width: 0; height: 20px; border-right: 1px solid #444; background: #9ACB34; 2.3.配置文件 web.xml中完成Servlet的配置。AjaxPracticeBackGroundServiceBackGroundServiceliuzuochen.sample.upload.BackGroundSer

40、viceBackGroundService*.actionwelcome-welcome-welcome-welcome-welcome-welcome-3.結(jié)語 整個(gè)程序到這里就介紹完了,希望它多少能為您的工作或?qū)W習(xí)帶來點(diǎn)兒幫助。 大學(xué)本科生畢業(yè)設(shè)計(jì)(論文)撰寫規(guī)范本科生畢業(yè)設(shè)計(jì)(論文)是學(xué)生在畢業(yè)前提交的一份具有一定研究價(jià)值和實(shí)用價(jià)值的學(xué)術(shù)資料。它既是本科學(xué)生開始從事工程設(shè)計(jì)、科學(xué)實(shí)驗(yàn)和科學(xué)研究的初步嘗試,也是學(xué)生在教師的指導(dǎo)下,對所進(jìn)行研究的適當(dāng)表述,還是學(xué)生畢業(yè)及學(xué)位資格認(rèn)定的重要依據(jù)。畢業(yè)論文撰寫是本科生培養(yǎng)過程中的基本訓(xùn)練環(huán)節(jié)之一,應(yīng)符合國家及各專業(yè)部門制定的有關(guān)標(biāo)準(zhǔn),符合漢語語法

41、規(guī)范。指導(dǎo)教師應(yīng)加強(qiáng)指導(dǎo),嚴(yán)格把關(guān)。1、論文結(jié)構(gòu)及要求論文包括題目、中文摘要、外文摘要、目錄、正文、參考文獻(xiàn)、致謝和附錄等幾部分。1.1 題目論文題目應(yīng)恰當(dāng)、準(zhǔn)確地反映論文的主要研究內(nèi)容。不應(yīng)超過25字,原則上不得使用標(biāo)點(diǎn)符號(hào),不設(shè)副標(biāo)題。1.2 摘要與關(guān)鍵詞1.2.1 摘要本科生畢業(yè)設(shè)計(jì)(論文)的摘要均要求用中、英兩種文字給出,中文在前。摘要應(yīng)扼要敘述論文的研究目的、研究方法、研究內(nèi)容和主要結(jié)果或結(jié)論,文字要精煉,具有一定的獨(dú)立性和完整性,摘要一般應(yīng)在300字左右。摘要中不宜使用公式、圖表,不標(biāo)注引用文獻(xiàn)編號(hào),避免將摘要寫成目錄式的內(nèi)容介紹。1.2.2 關(guān)鍵詞關(guān)鍵詞是供檢索用的主題詞條,應(yīng)采

42、用能覆蓋論文主要內(nèi)容的通用技術(shù)詞條(參照相應(yīng)的技術(shù)術(shù)語標(biāo)準(zhǔn)),一般列35個(gè),按詞條的外延層次從大到小排列,應(yīng)在摘要中出現(xiàn)。1.3 目錄目錄應(yīng)獨(dú)立成頁,包括論文中全部章、節(jié)的標(biāo)題及頁碼。1.4 論文正文論文正文包括緒論、論文主體及結(jié)論等部分。1.4.1 緒論緒論一般作為論文的首篇。緒論應(yīng)說明選題的背景、目的和意義,國內(nèi)外文獻(xiàn)綜述以及論文所要研究的主要內(nèi)容。文管類論文的緒論是畢業(yè)論文的開頭部分,一般包括說明論文寫作的目的與意義,對所研究問題的認(rèn)識(shí)以及提出問題。緒論只是文章的開頭,不必寫章號(hào)。畢業(yè)設(shè)計(jì)(論文)緒論部分字?jǐn)?shù)不多于全部論文字?jǐn)?shù)的1/4。1.4.2 論文主體論文主體是論文的主要部分,要求結(jié)構(gòu)合理,層次清楚,重點(diǎn)突出,文字簡練、通順。論文主體的內(nèi)容要求參照大學(xué)本科生畢業(yè)設(shè)計(jì)(論文)的規(guī)定第五章。論文主體各章后應(yīng)有一節(jié)“本章小結(jié)”。1.4.3 結(jié)論結(jié)論作為單獨(dú)一章排列,但不加章號(hào)。結(jié)論是對整個(gè)論文主要成果的歸納,要突出設(shè)計(jì)(論文)的創(chuàng)新點(diǎn),以簡練的文字對論文的主要工作進(jìn)行評價(jià),一般為4001 000字。1.5 參考文獻(xiàn)參考文獻(xiàn)是論文不可缺少的組成部分,它反映了論文的取材來源和廣博程度。論文中要注重引用近期發(fā)表的與論文工作直接有關(guān)的學(xué)術(shù)期刊類文獻(xiàn)。對理工類論文,參考文獻(xiàn)數(shù)量一般應(yīng)在15篇以上,其中學(xué)術(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論