ajaxjsp实现基于web的文件上传的进度控制说明书_第1页
ajaxjsp实现基于web的文件上传的进度控制说明书_第2页
ajaxjsp实现基于web的文件上传的进度控制说明书_第3页
ajaxjsp实现基于web的文件上传的进度控制说明书_第4页
ajaxjsp实现基于web的文件上传的进度控制说明书_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.引言 基于浏览器的文件上传,特别是对于通过标签来实现上传的情况, 存在着严重的性能问题,因为用户提交了文件之后,在浏览器把文件上传到服务器的过程中,界面看上去似乎是静止的,如果是小文件还好些,如果不幸需要上传的是几兆、几十兆甚至上百兆的文件,我相信那是一种非常痛苦的体验,我们中间的很多人应该都有过此种不堪的经历。(一笑)现在我就针对这个问题给出一个解决方案,我们将实现一个具有监控能力的WEB上传的程序它不仅把文件上传到服务器,而且实时地监视文件上传的实际过程。解决方案的基本思路是这样的: 在Form提交上传文件同时,使用AJAX周期性地从Servlet轮询上传状态信息 然后,根据此信息更新

2、进度条和相关文字,及时反映文件传输状态 如果用户取消上传操作,则进行相应的现场清理工作:删除已经上传的文件,在Form提交页面中显示相关信息 如果上传完毕,显示已经上传的文件内容(或链接) 在介绍源代码之前,我们先来看看程序运行界面:2.实现代码 实现代码想当然的有服务器端代码和客户端代码(呵呵),我们先从服务器端开始。2.1.服务器端代码2.1.1.文件上传状态类() 使用这个类记录文件上传状态,并将其作为服务器端与web客户端之间通信的媒介,通过对这个类对象提供上传状态作为服务器回应发送给web客户端, web客户端使用JavaScript获得文件上传状态。源代码如下:/* * 本例程演示

3、了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。 * 如果需要转载本例程,请您注明作者。 * * 作者: 刘作晨 * EMail: */package liuzuochen.sample.upload;import java.util.*;public class /上传用户地址 private String uploadAddr; /上传总量 private long uploadTotalSize = 0; /读取上传总量 private long readTotalSize = 0; /当前上传文件号 private int currentUpload = 0;

4、/成功读取上传文件数 private int successUpload = 0; /状态 private String status = ; /处理起始时间 private long processStartTime = 0l; /处理终止时间 private long processEndTime = 0l; /处理执行时间 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.文件上传状态侦听类() 使用Common- 1.2版本(20070103)。此版本提供了能够监视文件上传情况的ProcessListener接口,使开发者通过类对象的setProcessListener方法植入自己的Listener。 类实现了ProcessListener,在整个文件上传过程中,它对上传进度进行监控

13、,并且根据上传 情况实时的更新上传状态Bean。源代码如下:/* * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。 * 如果需要转载本例程,请您注明作者。 * * 作者: 刘作晨 * 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;/* * 更新状态 */public void update(long pBytesRead, long pContentLength, int pItems) statusBean= BackGroundService.getStatusBean(request);statusBean.setUploadTotalSize(pContentLength);/读取完成 if (pContentLength = -1) statusBean.setStatus(完成对 + p

15、Items +个文件的读取:读取了 + pBytesRead + bytes.); statusBean.setReadTotalSize(pBytesRead); statusBean.setSuccessUpload(pItems); statusBean.setProcessEndTime(System.currentTimeMillis(); statusBean.setProcessRunningTime(statusBean.getProcessEndTime(); /读取中 else statusBean.setStatus(当前正在处理第 + pItems +个文件:已经读取了

16、 + pBytesRead + / + pContentLength+ bytes.); statusBean.setReadTotalSize(pBytesRead); statusBean.setCurrentUpload(pItems); statusBean.setProcessRunningTime(System.currentTimeMillis(); BackGroundService.saveStatusBean(request,statusBean);2.1.3.后台服务类(BackGroundService) BackGroundService这个Servlet类负责接收F

17、orm Post数据、回应状态轮询请求、处理取消文件上传的请求。 尽管可以把这些功能相互分离开来,但为了简单明了,还是将它们放到Servlet中,只是由不同的方法进行分割。 源代码如下:/* * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。 * 如果需要转载本例程,请您注明作者。 * * 作者: 刘作晨 * EMail: */package liuzuochen.sample.upload;/* * Title: 后台服务 * * Description: 为客户端提供上传及文件传输状态查询服务 * */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); /* * 删除已经上传的文件 */ 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); /* * 上传过程中出错处理 */ private void uploadExceptionHandle( HttpServletRequest request, String errMsg) throws ServletException, IOException /首先删除已经上传的文件 deleteUploaded); satusBean = getStatusBean(request); satusBean.setStatus(errMsg); saveStatusBean(request, satu

24、sBean); /* * 初始化文件上传状态Bean */ private initStatusBean(HttpServletRequest request) satusBean = new (); satusBean.setStatus(正在准备处理); 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(); /设置内存缓冲区,超过后写入临时文件 factory.setSizeThreshold(10240000); /设置临时文件存储位置 factory.setRepository(new (/upload/temp); Servlet u

26、pload = new Servlet(factory); /设置单个文件的最大上传值 upload.set(102400000); /设置整个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, 上传文件时发生错误: + e.getMessage(); catch (Exception e) uploadExceptionHandle(request, 保存上传文件时发生错误: + e.getMessage(); if (forwardURL.length() = 0) forwardURL = DEFAULT_UPLOAD_FAILURE_URL; request.getRequ

29、estDispatcher(forwardURL).forward(request, response); /* * 回应上传状态查询 */ 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.文件上传状态控制类(BeanControler) 这是一个单例类,它的功能是为客户端保存文件上传状态,这里我没有使用Session来存储文件上传状态,因为对于AJAX这种异步调用,服务器会开启不同的Session,所以无法通过Session保存文件上传状态。 我并不认为这种方法最好,如果有更好的方法,欢迎大家一起讨论。 源代码如下:/* * 本例程演

33、示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。 * 如果需要转载本例程,请您注明作者。 * * 作者: 刘作晨 * EMail: */package liuzuochen.sample.upload;/* * Title: 类控制器 * * Description: 主要作用是对进行管理,为客户端提供相应的 * 类对象。这是一个单例类。 * */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; /* * 取得相应类对象的存储位置 */ 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; /* * 取得相应类对象 */ public getUploadStatus(String strID) return () vector.elementAt(indexOf(strID); /* * 存储类对象 */ 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进行了封装。请下载分析2.2.2. 是文件上传界面

37、。 请下载。 2.2.3.result.jsp result.jsp是文件上传结果显示界面。 请下载 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.结语 整个程序到这里就介绍完了,希望它多少能为您的工作或学习带来点儿帮助。 大学本科生毕业设计(论文)撰写规范本科生毕业设计(论文)是学生在毕业前提交的一份具有一定研究价值和实用价值的学术资料。它既是本科学生开始从事工程设计、科学实验和科学研究的初步尝试,也是学生在教师的指导下,对所进行研究的适当表述,还是学生毕业及学位资格认定的重要依据。毕业论文撰写是本科生培养过程中的基本训练环节之一,应符合国家及各专业部门制定的有关标准,符合汉语语法

41、规范。指导教师应加强指导,严格把关。1、论文结构及要求论文包括题目、中文摘要、外文摘要、目录、正文、参考文献、致谢和附录等几部分。1.1 题目论文题目应恰当、准确地反映论文的主要研究内容。不应超过25字,原则上不得使用标点符号,不设副标题。1.2 摘要与关键词1.2.1 摘要本科生毕业设计(论文)的摘要均要求用中、英两种文字给出,中文在前。摘要应扼要叙述论文的研究目的、研究方法、研究内容和主要结果或结论,文字要精炼,具有一定的独立性和完整性,摘要一般应在300字左右。摘要中不宜使用公式、图表,不标注引用文献编号,避免将摘要写成目录式的内容介绍。1.2.2 关键词关键词是供检索用的主题词条,应采

42、用能覆盖论文主要内容的通用技术词条(参照相应的技术术语标准),一般列35个,按词条的外延层次从大到小排列,应在摘要中出现。1.3 目录目录应独立成页,包括论文中全部章、节的标题及页码。1.4 论文正文论文正文包括绪论、论文主体及结论等部分。1.4.1 绪论绪论一般作为论文的首篇。绪论应说明选题的背景、目的和意义,国内外文献综述以及论文所要研究的主要内容。文管类论文的绪论是毕业论文的开头部分,一般包括说明论文写作的目的与意义,对所研究问题的认识以及提出问题。绪论只是文章的开头,不必写章号。毕业设计(论文)绪论部分字数不多于全部论文字数的1/4。1.4.2 论文主体论文主体是论文的主要部分,要求结构合理,层次清楚,重点突出,文字简练、通顺。论文主体的内容要求参照大学本科生毕业设计(论文)的规定第五章。论文主体各章后应有一节“本章小结”。1.4.3 结论结论作为单独一章排列,但不加章号。结论是对整个论文主要成果的归纳,要突出设计(论文)的创新点,以简练的文字对论文的主要工作进行评价,一般为4001 000字。1.5 参考文献参考文献是论文不可缺少的组成部分,它反映了论文的取材来源和广博程度。论文中要注重引用近期发表的与论文工作直接有关的学术期刊类文献。对理工类论文,参考文献数量一般应在15篇以上,其中学术

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论