commons-fileupload和dwr实现带有进度条的文件上传

来源:互联网 发布:2017全国进出口数据 编辑:程序博客网 时间:2024/05/16 07:20
  

使用commons-fileupload和DWR实现带有进度条的上传


1%, 5%, 10%   已经上传的数据/数据的总大小  ********               
 

1. 增加jar: commons-fileupload.jar,  commons-io.jar, dwr.jar

  2. upload.jsp页面中增加: 

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

 <% 

String path = request.getContextPath(); 

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 <html> 

  <head> 

    <base href="<%=basePath%>"/> 

        <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>  <title>视频上传</title>  

  <script src="js/upload.js"  type="text/javascript"></script>   

 <script src='dwr/interface/UploadMonitor.js'> </script>  

 <script src='dwr/engine.js'> </script>   

<script src='dwr/util.js'> </script> 

 </head> 

<body>  

 
<form action="upload" name="newForm" enctype="multipart/form-data" method="post" onsubmit="return startProgress(); "> 
   地址:<input type="file" name="file1 " maxlength="100" id="file1" /> 

     <input name="submit22" type="submit" value="上传" id="uploadbutton" />   

</form> 

  <div id="ppop" style="font-size:50px;color:red;"></div>   <br/> 
 
 
<div id="progressBar" style="display: none;"> 
    <div style="width:189px; height:13px; background:url(images/glod_bg.gif) no-repeat center;align:left;" align="left">  
 <div id="eProgress" style="width:1%; height:9px; background:url(images/glod.gif) repeat-x center; margin:2px;align:left;" align="left"> </div>    
</div>  
</div>  
</body> 
</html> 
 

3. 在images/下面引入:gold_bg.gif, glob.gif两个图片。

 4. 引入upload.js:( 控制进度条的主要程序) 

function refreshProgress() { 
  UploadMonitor.getUploadInfo(updateProgress); }  
function updateProgress(uploadInfo) { 
  if (uploadInfo.inProgress)   { 
      document.getElementById('uploadbutton').disabled = true;     document.getElementById('file1').disabled = true;   
    var fileIndex = uploadInfo.fileIndex; 
    var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);   
    document.getElementById('eProgress').style.width = progressPercent + '%';  

document.getElementById('ppop').innerHTML=progressPercent + '%';     window.setTimeout('refreshProgress()', 3000); 

  }   else   { 

    document.getElementById('uploadbutton').disabled = false;   

  document.getElementById('file1').disabled = false;  

     }  

  return true;

 }  

function startProgress() { 

 var s = document.newForm.file1.value ;  

var i = s.lastIndexOf("."); 

  var var1 = s.substring(i+1) ; 

 

if(var1 != "asf" && var1 !="wmv" && var1 !="avi" && var1 !="mpeg" && var1 !="mpg" && var1 !="rm" && var1 !="rmvb" && var1 !="vob" &&  var1 !="3gp" && var1 !="mp4" && var1 !="swf" && var1 !="flv")  { 

  alert("文件格式不是视频格式,请重新选择文件!!");  

 return false; 

 }  
 

  document.getElementById('progressBar').style.display = 'block'; 

 document.getElementById('uploadbutton').disabled = true;  

  // wait a little while to make sure the upload has started ..    

  window.setTimeout("refreshProgress()", 1500);   return true;

 } 

  
5. dwr.xml中增加: 
<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd"> <dwr>   

<allow>    

<create creator="new" javascript="UploadMonitor">       

 <param name="class" value="com.puckasoft.video.upload.UploadMonitor"/>  

    </create> 
        <convert converter="bean" match="com.puckasoft.video.upload.UploadInfo"/>  
 
 
</allow>  </dwr>  
 

6. copy文件到com.puckasoft.video.upload包下面。(一共7个java文件)

 7. UploadFile.java中的代码:  

public class UploadFile extends HttpServlet {  

protected void  doPost (HttpServletRequest request,    HttpServletResponse response) throws ServletException, IOException {  

   String tempDirectory = Constant.uploadFileTemp; // 必须加后面的斜杠  

 String fileDirectory = this.getServletContext().getRealPath("\\vfile")+"\\";; // where the upload file saved   

String outFileName = null;   

 try {    

 UploadOutputStreamListener  uploadOutputStreamListener = new UploadOutputStreamListener(request, 1); 

   int sizeThreshold = 1024 * 64;  //写满该大小的缓存后,存入硬盘中。    

File repositoryFile = new File(tempDirectory);    

 FileItemFactory factory = new MonitoredDiskFileItemFactory( sizeThreshold, repositoryFile,  uploadOutputStreamListener);     

ServletFileUpload upload = new ServletFileUpload(factory);   

  upload.setSizeMax(500 * 1024 * 1024); // set every upload file'size less than 500M    

 List items = upload.parseRequest(request);   //这里开始执行上传    

 Iterator iter = items.iterator();    

 while (iter.hasNext()) {    

  FileItem item = (FileItem) iter.next();   //FileItem就是表示一个表单域。      

if(item.isFormField()){ //isFormField方法用于判断FileItem是否代表一个普通表单域(即非file表单域)       

System.out.println(item.getFieldName());       

}else {      

 String fieldName = item.getFieldName();  //获取表单域name属性的值       

String fileName = item.getName();     //返回该文件在客户机上的文件名。e.g: d:/video/1.wmv       

String filesize = String.valueOf(item.getSize());       

int site = fileName.lastIndexOf("\\");     

  if (site!=-1) {      

  fileName = fileName.substring(site + 1);      

 }       

String  fileType = fileName.substring(fileName.lastIndexOf("."));       

String absoluteName=new Date().getTime()+fileType ;   //存储在本地硬盘上的文件名              

outFileName = fileDirectory + absoluteName; 

      File uploadedFile = new File(outFileName);       item.write(uploadedFile);              request.setAttribute("videoFilePath", absoluteName);      }     } 
   } catch (Exception e) {   

  e.printStackTrace();  

   } 
   rd.forward(request, response); //成功后的跳转 
 } 

}

原创粉丝点击