dwr+ajax和struts开发文件上传进度条

本文介绍如何使用DWR+Ajax技术实现文件上传进度显示功能。通过示例代码展示了如何设置Struts框架以支持文件上传,并在客户端展示实时的上传进度。文章还提供了实现进度条功能所需的JavaScript脚本及Struts配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dwr+ajax和struts开发文件上传进度条
2010年01月24日
  index.jsp这个是上传页面,upload.jsp负责上传,resources包里面包含了dwr与服务器通讯的javascript脚本,你需要把index.jsp的form中的action换成你的struts action即可,然后把form中的file名改成你actionform中的file属性名,把页面中剩余的file去掉index.jsp上传页面示例代码:
  
  
  
  
  
  function check_file() {
  var strFileName=document.forms(0).file;
  if (strFileName.value==""){
  alert("请选择要上传的文件");
  return false;
  }
  startProgress();
  }
  function loadmessage(){
  
  window.alert("");
  window.returnValue="yes";
  
  }
  
  上传
  /resources/js/upload.js'>
  /dwr/interface/UploadMonitor.js'>
  /dwr/engine.js'>
  /dwr/util.js'>
  
  #progressBar { padding-top: 5px; }
  #progressBarBox { width: 350px; height: 20px; border: 1px inset; background: #eee;}
  #progressBarBoxContent { width: 0; height: 20px; border-right: 1px solid #444; background: blue; }
  
  /css/style.css" type="text/css" rel="stylesheet">
  
  
  
  
  
  
  /upload.do?method=upload" enctype="multipart/form-data" onSubmit="return check_file()">
  
  
  从文件导入:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  并且要修改一下\resources\js中的upload.js文件:
  /* Licence:
  * Use this however/wherever you like, just don't blame me if it breaks anything.
  *
  * Credit:
  * If you're nice, you'll leave this bit:
  *
  * Class by Pierre-Alexandre Losson -- http://www.telio.be/blog
  * email : plosson@users.sourceforge.net
  */
  function refreshProgress()
  {
  UploadMonitor.getUploadInfo(updateProgress);
  }
  function updateProgress(uploadInfo)
  {
  if (uploadInfo.inProgress)
  {
  document.getElementById('uploadbutton').disabled = true;
  document.getElementById('file').disabled = true;
  var fileIndex = uploadInfo.fileIndex;
  var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);
  document.getElementById('progressBarText').innerHTML = '文件读取进度: ' + progressPercent + '%';
  document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * 3.5) + 'px';
  window.setTimeout('refreshProgress()', 1000);
  }
  else
  {
  document.getElementById('uploadbutton').disabled = false;
  document.getElementById('file').disabled = false;
  }
  return true;
  }
  function startProgress()
  {
  document.getElementById('progressBar').style.display = 'block';
  document.getElementById('progressBarText').innerHTML = '文件读取进度: 0%';
  document.getElementById('uploadbutton').disabled = true;
  // wait a little while to make sure the upload has started ..
  window.setTimeout("refreshProgress()", 1000);
  return true;
  }
  [b]配置[/b][b]dwr.xml[/b]
  放在/WEB-INF/下面[b][/b]
  
  
  
  
  
  
  
  
  [b]web.xml[/b][b]中配置[/b][b]dwr[/b],省略spring,struts等的配置
  
  dwr-invoker
  DWR Servlet
  uk.ltd.getahead.dwr.DWRServlet
  
  debug
  false
  
  
  logLevel
  WARN
  
  
  
  dwr-invoker
  /dwr/*
  
  [b]编写[/b][b]struts[/b][b]的[/b][b]MultipartRequestHandler[/b]:AjaxMultipartRequestHandler
  实现 MultipartRequestHandler接口并在struts-config.xml的controller中替换默认的multipartClass
  
  
  
  其实这个类AjaxMultipartRequestHandler编写很简单,把struts的src源码中的org.apache.struts.upload.CommonsMultipartRequestHandler.java修改一下就可以了[b]:[/b]
  在[b]public[/b] [b]void[/b] handleRequest(HttpServletRequest request)
  [b]throws[/b] ServletException {
  方法中把定义factory之前的那几行代码注释掉然后写入
  UploadListener listener = [b]new[/b] UploadListener(request, 30);
  FileItemFactory factory = [b]new[/b] MonitoredDiskFileItemFactory(listener);
  之后再注释掉
  // upload.setSizeThreshold((int) getSizeThreshold(ac));
  // upload.setRepositoryPath(getRepositoryPath(ac));
  这个类就算写完了
  [b]编写[/b][b]struts[/b][b]上传类[/b][b][/b]
  就用你原来编写的struts上传类
  上传方法代码段示例:
  /**
  * 上传文件
  */
  [b]public[/b] ActionForward upload(ActionMapping mapping, ActionForm form,
  HttpServletRequest request, HttpServletResponse response)
  [b]throws[/b] Exception {
  String path = getServlet().getServletContext().getRealPath("/");
  log.info(">>>>>>>>>>>>>>>path:" + path);
  [b]if[/b] (form == [b]null[/b]) {
  [b]return[/b] mapping.findForward("success");
  }
  FileUploadForm fuf = (FileUploadForm) form;
  FormFile file = fuf.getFile();
  [b]try[/b] {
  [b]if[/b] (file == [b]null[/b]) {
  log.info(">>>>>>>>>>>>>>>file为空");
  [b]return[/b] mapping.findForward("success");
  }
  } [b]catch[/b] (Exception e) {
  e.printStackTrace();
  }
  String fname = file.getFileName();
  [b]int[/b] t = 0;
  [b]for[/b] ([b]int[/b] i = 0; i 0) {
  filename = fname.substring(0, t);
  }
  log.info(">>>>>>>>>>>>>>>文件名:" + filename);
  String filepath = path + "dataimport/upfiles/" + fname;
  File f = [b]new[/b] File(path + "dataimport/upfiles/");
  log.info(">>>>>>>>>>>>>>>文件生成路径:" + filepath);
  [b]if[/b] (!f.exists()) {
  f.mkdirs();
  } [b]else[/b] {
  log.info(">>>>>>>>>>>>>>>路径存在");
  }
  InputStream stream = file.getInputStream();
  OutputStream os = [b]new[/b] FileOutputStream(path + "dataimport/upfiles/"
  + fname);
  [b]int[/b] readBytes = 0;
  [b]byte[/b] buffer[] = [b]new[/b] [b]byte[/b][8192];
  [b]while[/b] ((readBytes = stream.read(buffer, 0, 8192)) != -1) {
  os.write(buffer, 0, readBytes);
  }
  os.close();
  stream.close();
  file.destroy();
  String message = "成功!";
  request.setAttribute("message", message);
  [b]return[/b] mapping.findForward("success");
  }
  *************************************************************************************
  利用DWR实现文件上传进度条
  来自telio.be的JS:
  1
  
  
  
  /**//* Licence:
  2
  
  * Use this however/wherever you like, just don't blame me if it breaks anything.
  3
  
  *
  4
  
  * Credit:
  5
  
  * If you're nice, you'll leave this bit:
  6
  
  *
  7
  
  * Class by Pierre-Alexandre Losson -- http://www.telio.be/blog
  8
  
  * email : plosson@users.sourceforge.net
  9
  
  */
  10
  
  function refreshProgress()
  11
  
  
  
  
  
  {
  12
  
   UploadMonitor.getUploadInfo(updateProgress);
  13
  
  }
  14
  
  
  15
  
  function updateProgress(uploadInfo)
  16
  
  
  
  
  
  {
  17
  
   if (uploadInfo.inProgress)
  18
  
  
  
  
  
  {
  19
  
   document.getElementById('uploadbutton').disabled = true;
  20
  
   document.getElementById('file1').disabled = true;
  21
  
  
  22
  
   var fileIndex = uploadInfo.fileIndex;
  23
  
  
  24
  
   var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);
  25
  
  
  26
  
   document.getElementById('progressBarText').innerHTML = 'upload in progress: ' + progressPercent + '%';
  27
  
  
  28
  
   document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * 3.5) + 'px';
  29
  
  
  30
  
   window.setTimeout('refreshProgress()', 1000);
  31
  
   }
  32
  
   else
  33
  
  
  
  
  
  {
  34
  
   document.getElementById('uploadbutton').disabled = false;
  35
  
   document.getElementById('file1').disabled = false;
  36
  
   }
  37
  
  
  38
  
   return true;
  39
  
  }
  40
  
  
  41
  
  function startProgress()
  42
  
  
  
  
  
  {
  43
  
   document.getElementById('progressBar').style.display = 'block';
  44
  
   document.getElementById('progressBarText').innerHTML = 'upload in progress: 0%';
  45
  
   document.getElementById('uploadbutton').disabled = true;
  46
  
  
  47
  
   // wait a little while to make sure the upload has started ..
  48
  
   window.setTimeout("refreshProgress()", 1500);
  49
  
   return true;
  50
  
  }
  51
  
  
  一个可以有其他页面引用的进度条页面:
  1
  
  
  
   String path = request.getContextPath();
  3
  
   String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  4
  
  %>
  5
  
  common/js/upload.js">
  6
  
  dwr/interface/UploadMonitor.js">
  7
  
  dwr/engine.js">
  8
  
  dwr/util.js">
  9
  
  
  10
  
  
  
   body
  
  { font: 11px Lucida Grande, Verdana, Arial, Helvetica, sans serif; }
  11
  
  
  
   #progressBar
  
  { padding-top: 5px; }
  12
  
  
  
   #progressBarBox
  
  { width: 350px; height: 20px; border: 1px inset; background: #eee;}
  13
  
  
  
   #progressBarBoxContent
  
  { width: 0; height: 20px; border-right: 1px solid #444; background: #9ACB34; }
  14
  
  
  15
  
  
  16
  
  
  17
  
  
  18
  
  
  19
  
  
  20
  
  
  21
  
  
  22
  
  
  23
  
  
  在dwr.xml 中的配置:
  1
  
  
  2
  
  
  
  "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4
  
  
  5
  
  
  6
  
  
  7
  
  
  8
  
  
  9
  
  
  10
  
  
  11
  
  
  在web.xml中增加如下对DwrServlet的配置:
  1
  
  
  2
  
   dwr-invoker
  3
  
   org.directwebremoting.servlet.DwrServlet
  4
  
  
  5
  
   debug
  6
  
   false
  7
  
  
  8
  
  
  9
  
   pollAndCometEnabled
  10
  
   true
  11
  
  
  12
  
  
  13
  
   allowGetForSafariButMakeForgeryEasier
  14
  
   true
  15
  
  
  16
  
   2
  17
  
  
  18
  
  
  19
  
  
  20
  
   dwr-invoker
  21
  
   /dwr/*
  22
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值