`

手工写的上传文档进度条

    博客分类:
  • OA
阅读更多

JavaBean(用于DWR与前台传值)

public class UploadInfo {
	private List<Long> hasUpload = new ArrayList<Long>();
	private List<Long> totalSize = new ArrayList<Long>();

	getter and setter....
}

处理上传的Action

	@Override
	public String execute() throws Exception {
		DocumentCatalog catalog = catalogServie.getDocumentCatalog(catalogId);
		List<DocumentItem> list = new ArrayList<DocumentItem>();
		DocumentItem item = null;
		Date date = new Date();
		String type;
		String fileName;
		File f = null;
//		long totalSize = 0;
//		for(File ss : file){
//			totalSize += ss.length();
//		}
		//设置进度条所需要的信息
		//这个对象不可以在循环中声明,要不每一次取得到值都是为空
		UploadInfo uploadInfo = new UploadInfo();
		for (int i = 0; i < file.size(); ++i) {
			item = new DocumentItem();
			fileName = fileFileName.get(i);
			f = file.get(i);
			item.setCatalog(catalog);
			item.setCreateDate(date);
			item.setRealSize(f.length());
			item.setName(fileName);
			type = FileUtils.getFileExtName(fileName, false);
			item.setType(type);
			item.setSize(FileUtils.getStringSize(f.length()));
			item.setRandomName(FileUtils.getRandomFileName(5)+"."+type);
			
			String separator = File.separator;
			// 文档的路径
			String itemStorage = FileStorage.getDocumentItemStoragepath(ServletActionContext.getRequest());
			// 创建上传文件
			File upload = new File(itemStorage + separator + catalogId + separator + item.getRandomName());
			// 如果目录不存在,强制创建该目录,而在JAVA中目录和文件是一样的,所以创建上一层的目录就可以了
			org.apache.commons.io.FileUtils.forceMkdir(upload.getParentFile());
			//uploadInfo.setTotalSize(totalSize);
			uploadInfo.getTotalSize().add(f.length());
			//先存一个值,要不下面写hasUpload的时候会出错!
			uploadInfo.getHasUpload().add(0L);
			
			ServletActionContext.getRequest().getSession().setAttribute("uploadInfo", uploadInfo);

			InputStream is = new FileInputStream(f);
			byte[] buffer = new byte[1024];
			int len = 0;
			OutputStream os = new FileOutputStream(upload);
			while (-1 != (len = is.read(buffer))) {
				//Thread.sleep(10);
				os.write(buffer, 0, len);
				//设置已读的值
				uploadInfo.getHasUpload().set(i, uploadInfo.getHasUpload().get(i)+len);
			}
			is.close();
			os.close();
			// 保存文档
			list.add(item);
		}
		ServletActionContext.getRequest().getSession().removeAttribute("uploadInfo");
		this.service.addDocumentItems(catalog, list);
		return SUCCESS;
	}

 JSP代码

<tr>
	<td colspan="2">
		<div id="bar" style="display:none;">
		</div>
	</td>
</tr>

 JS代码:

<script type="text/javascript">
    var count=0;     //动态添加的文档计数器
    var num=1;
    var maxUploadFileCount = 4;    //动态可添加要上传的文档数量
    function addMore(){
        if(count == maxUploadFileCount){
            alert("一次上传不能超过"+(maxUploadFileCount+1)+"个文档");
            return ;
        }
        var theTd = document.getElementById("td");
        var br = document.createElement("br");
        var obj = document.createElement("input");
        var button = document.createElement("input");

        obj.type = "file";
        obj.name = "file";
        obj.id = "file"+ ++num;
        obj.size = 40;

        button.type = "button";
        button.value = "删除文件";
        button.onclick = function(){
            theTd.removeChild(button);
            theTd.removeChild(obj);
            theTd.removeChild(br);
            --count;
        };

        theTd.appendChild(br);
        theTd.appendChild(obj);
        theTd.appendChild(button);
        ++count;
    }

    function validate(){
        var theTr = document.getElementById("tr");
        var firstFile = document.getElementById("file") ;
        if(firstFile!=null && firstFile.value.length==0){
           alert("不能有留空的上传选项!");
           return false;
        }
        
        for(var i=0;i<num;++i){
            var file = document.getElementById("file"+num);
            if(file!=null && file.value.length==0){
               alert("不能有留空的上传选项!");
               return false;
            }
        }
         var inputs = document.getElementsByTagName("input");
        for(var i=0;i<inputs.length;++i){
            var type = inputs[i].type;
            if( type=="button" || type=="submit" || type=="reset"){
                inputs[i].disabled = true;
            }
            if(type=="file"){
                inputs[i].readOnly=true;
            }
        }
    	startUpload();
        
        return true;
    }

    function startUpload(){

        var outerDiv = document.getElementById("bar");
        var fileArray = new Array();
        var inputs = document.getElementsByTagName("input");
        for(var i=0;i<inputs.length;++i){
           if(inputs[i].type == "file"){
               var fileName = inputs[i].value;
               var index = fileName.indexOf("\\");
               if(-1 == index){
                   index = fileName.indexOf("/");  
               }
               fileName = fileName.substring(index+1,fileName.length);
               fileArray.push(fileName);
           }
        }


        for(var i=0;i<count+1;++i){
            var numDiv = document.createElement("div");
            var fileName = fileArray[i];
            if(fileName.length>35){
                fileName = fileName.substring(0,35)+"...";
            }
            fileName +="&nbsp;&nbsp;&nbsp;"


            numDiv.id = "num"+i;
            numDiv.innerHTML = i+1+":&nbsp;&nbsp;&nbsp;";
            numDiv.style.cssFloat = "left"; //针对FF
            numDiv.style.styleFloat = "left"; //针对IE

            var nameDiv = document.createElement("div");
            nameDiv.id = "name"+i+1;
            nameDiv.style.cssFloat = "left"; //针对FF
            nameDiv.style.styleFloat = "left"; //针对IE
            nameDiv.style.width="320px";
            nameDiv.innerHTML = fileName;

//            <div id="bar" style="width: 300px; height: 20px; border: 1px; background: #eee; float: left;">
//                <div id="processBar" style="width: 0px; height: 20px; background: green;"></div>
//            </div>
            var innerDiv = document.createElement("div");
            innerDiv.style.width = "300px";
            innerDiv.style.height = "20px";
            innerDiv.style.border = "1px";
            innerDiv.style.background = "#eee";
            innerDiv.style.cssFloat = "left"; //针对FF
            innerDiv.style.styleFloat = "left"; //针对IE

            var processBarDiv = document.createElement("div");
            processBarDiv.id = "processBar"+i;
            processBarDiv.style.width = "0px";
            processBarDiv.style.height = "20px";
            processBarDiv.style.background = "green";
//            processBarDiv.style.cssFloat = "left"; //针对FF
//            processBarDiv.style.styleFloat = "left"; //针对IE

            var rateDiv = document.createElement("div");
            rateDiv.id = "rateDiv"+i;
            rateDiv.innerHTML = "&nbsp;&nbsp;"+"0%";

            outerDiv.appendChild(numDiv);
            outerDiv.appendChild(nameDiv);

            innerDiv.appendChild(processBarDiv);

            outerDiv.appendChild(innerDiv);
            outerDiv.appendChild(rateDiv);
        }
        window.setTimeout("startProcess()",200);
    }

    function startProcess(){
        uploadInfoListener.getUploadInfo(showProcessBar);
    }

    function showProcessBar(data){
        var process = 0;
        var barBox = document.getElementById("bar");
        barBox.style.display = "block";
        var test = document.getElementById("test");
        for(var i=0;i<count+1;++i){
            process=data.hasUpload[i]/data.totalSize[i]*100;
            if(isNaN(process)){
                if(data.hasUpload[i]>0){
					process=100;
                }else{
                	process=0;
                }
            }
            var processRate = document.getElementById("rateDiv"+i);
            processRate.innerHTML = Math.floor(process)+"%";
            var processBar = document.getElementById("processBar"+i);
            processBar.style.width= process*3+"px";
            test.innerHTML="hasUpload="+data.hasUpload[i]+"<br>totalSize="+data.totalSize[i]+"<br>Process="+process;
        }
        window.setTimeout("startProcess()",200);
    }
</script>
 

 

分享到:
评论

相关推荐

    Layui实现文件上传进度条

    Layui实现文件上传进度条 Layui是一个优秀的前端框架,它提供了很多实用的UI组件和功能之一就是进度条组件。今天我们将探讨如何使用Layui实现文件上传进度条。 进度条组件 Layui的进度条组件是一个轻量级的UI组件...

    c# 上传文件进度条

    在.NET C#环境中,创建一个文件上传进度条功能是一项常见的需求,特别是在开发Web应用程序时。这个功能能够提供用户友好的体验,让用户了解文件上传的状态,提高交互性。在这个项目中,我们将探讨如何实现这一功能,...

    php 上传显示进度条

    php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条php上传进度条

    文件上传 带进度条 非常漂亮!

    ### 文件上传技术与进度条实现:深入解析与代码解读 #### 标题解析:“文件上传 带进度条 非常漂亮!” 标题强调了文件上传功能的一个关键特性——带有美观进度条的上传机制。这表明在进行文件传输时,用户能够...

    MFC 单文档 状态栏 进度条

    在Microsoft Foundation Class (MFC)库中,"单文档"(Single Document Interface, SDI)是一种常见的应用程序设计模式,它允许用户处理一个单一的文档在一个窗口中。在这样的应用程序中,状态栏通常位于窗口的底部,...

    jquery 上传,批量上传 进度条显示

    当涉及到文件上传,尤其是批量上传和进度条显示时,jQuery 提供了一些强大的插件和方法来实现这些功能。在本篇文章中,我们将深入探讨如何利用 jQuery 实现文件上传,特别是批量上传和进度条显示的技术细节。 首先...

    ajax上传进度条,form上传文件进度条

    在现代Web应用中,用户界面的交互性和用户体验是至关重要的,而“ajax上传进度条”和“form上传文件进度条”就是提升这方面体验的重要技术。本文将深入探讨这两种技术的原理、实现方式以及如何在实际项目中应用。 ...

    android 文件上传含进度条

    在Android开发中,实现文件上传并展示进度条是一项常见的需求,尤其在用户需要长时间等待的场景下,如上传大文件时。"android 文件上传含进度条"这个标题恰好揭示了我们要实现的功能:在Android应用中,既要能上传...

    java写的进度条实例

    用java语言写的一个进度条的实例程序,很有帮助的!

    apache commons 上传 进度条

    在IT行业中,尤其是在Web开发领域,用户经常需要上传文件,如图片、文档等。当上传的文件较大时,用户体验往往受到影响,因为用户无法得知文件上传的状态,这可能导致焦虑和不耐烦。Apache Commons项目提供了一系列...

    asp.net上传图片带进度条

    在ASP.NET中实现图片上传并显示进度条的功能是一项常见的需求,尤其在用户上传大体积图片时,进度条能提供良好的用户体验。以下将详细介绍如何在ASP.NET中构建这样的功能。 首先,我们需要理解上传过程的基本原理。...

    新 ASP无组件上传带进度条 (源码 + 实例)

    ASP无组件上传带进度条是一种在ASP(Active Server Pages)环境下实现文件上传并显示上传进度的技术,无需额外的服务器组件。这种技术对于提高用户体验尤其重要,因为它允许用户在上传大文件时了解进度,减少了用户...

    批量上传文件带进度条

    为了提供良好的用户体验,通常会结合进度条功能,让用户能够实时了解文件上传的状态。在这个场景下,"批量上传文件带进度条"主要涉及的技术点有Java编程语言、多线程、FTP文件传输协议以及用户界面(UI)的设计。 ...

    Flash多文件上传加进度条

    在IT行业中,多文件上传和进度条功能是网站和应用程序中常见的需求,特别是在处理大量数据时。Flash曾经是实现这些功能的一种流行技术,尤其是在HTML5的File API尚未普及之前。本篇文章将深入探讨如何利用Flash实现...

    C#批量上传 进度条(包括各种上传例子)

    在IT行业中,尤其是在Web开发领域,用户经常需要上传文件,如图片、文档等。为了提供良好的用户体验,开发者通常会引入进度条功能,让用户能够实时了解上传进度。本压缩包"‘C#批量上传 进度条(包括各种上传例子)...

    无组件上传带进度条asp版

    【标题】"无组件上传带进度条asp版"所涉及的知识点主要集中在ASP(Active Server Pages)编程语言中实现文件上传的功能,同时结合了进度条显示以提供用户友好的交互体验。在传统的ASP中,文件上传通常需要借助第三方...

    js实现文件上传进度条

    在JavaScript中实现文件上传进度条是一项重要的用户交互优化工作,它可以显著提升用户体验,尤其是在处理大文件上传时。本文将深入探讨如何实现这一功能,主要涉及以下几个关键知识点: 1. **进度条的实现**:...

    jquery ajax上传 带进度条

    在Web开发中,jQuery AJAX是实现异步数据交互的关键技术,它可以实现在不刷新整个页面的情况下与服务器交换数据。...这种技术可以广泛应用于各种需要文件上传的Web应用程序中,如图片分享、文档提交等场景。

    JSP源码,图片上传,进度条,JSP图片上传实例

    在这个“JSP源码,图片上传,进度条,JSP图片上传实例”的主题中,我们将深入探讨如何使用JSP进行图片上传,并结合进度条展示上传进度。 首先,图片上传功能是网站或应用程序中常见的一种交互需求。用户可以通过这种...

    springmvc带进度条上传源码

    在提供的"springmvc带进度条上传源码"中,可能包含了这些功能的实现,包括控制器、服务层、视图层以及前端的HTML、CSS和JavaScript文件。分析这些源码可以帮助你更好地理解文件上传和进度条显示的完整流程。如果你...

Global site tag (gtag.js) - Google Analytics