`

java/extjs上传文件,显示真实进度条

 
阅读更多

当前idle状态!捣腾了一个文件上传功能,小温故了一把java/servlet上传的原理。
上传代码未用struts2,读取进度时才用了一下,本身struts2也把下面2个开源包'集成'进去了!代码都是在网上cp的,自己拼凑,加了一些注释。

当然,如果页面上没有Form表单(甚至是也未用struts2框架),就无法以表单(mutilpart/form-data格式)提交到后台,这时候可以借用第三方控件,如:flash插件或 (c++ ocx)控件等,辅助模仿form表单提交到jsp页面,再用jsp接收输入流,达到上传文件的目的!

如若想详细了解servlet上传,请参见这位大神的文章:http://www.ibm.com/developerworks/cn/java/fileup/

用struts2框架上传的文章:http://blog.csdn.net/lenotang/article/details/2784843

 

需要的jar:commons-fileupload-x.x.x.jar 和 commons-io-x.x.x.jar

 

首先是前端页面代码,(extjs3.3.1)

 

var m =0 ;		
var _interval;
 Ext.onReady(function() {
			var formPanel = new Ext.form.FormPanel({  
    			labelWidth:80,
				id:'formPanel', 
			    bodyStyle:'padding:5 0 0 0 ',  
			    height:515,  
			    width:200,  
			    frame:true,  
			    fileUpload:true,  
			    items:[new Ext.form.TextField({     
					    id:'excelUpload',   
					    anchor:'90%',     
					    height:30,  
					    width:350,    
					    name:'file',  
					    inputType:'file',  
					    fieldLabel:'文件选择'  
					})
				]  
			});  
			
			var upLoadFile = new Ext.Toolbar.Button({  
			    text:'上传',
			    listeners:{
			    	'click': uploadFiles
			    }
			}); 
			
			new Ext.Window({  
				    title:'上传文件',  
				    width:400,  
				    height:140,
				    minWidth:400,  
				    id:'uploadWin',
				    minHeight:140,  
				    layout:'fit',  
				    plain:true,  
				    bodyStyle:'padding:5px;',  
				    buttonAlign:'center',  
				    items:formPanel,  
				    buttons:[upLoadFile]
			    }).show(); 
			});
	function uploadFiles(t){
		var excelName = Ext.getCmp('excelUpload').getRawValue();// 上传文件名称的路径  
	    if (excelName == ""){  
	        Ext.Msg.alert("提示","请选择需要上传的文件!");  
	        return;  
	    }else {  
		        var array = new Array();  
		        array = excelName.split("\\");  
		        var length = array.length;  
		        var fileName = "";  
		        var index = 0;  
		        for (index = 0; index < length; index++) {  
		            if (fileName == "") {  
		                fileName = array[index];  
		            } else {  
		                fileName = fileName + "/" + array[index];  
		            }  
		        }  
		        _interval = setInterval("showRequest()", 100);
		        Ext.getCmp("formPanel").getForm().submit({  
		            url:'servlet/fileUpload',  
		            method:'POST',  
		            success:function(form, action, o) {  
		                Ext.MessageBox.alert("提示信息",action.result.message);  
		                	Ext.getCmp("uploadWin").setTitle("上传文件");
		            },  
		            failure : function(form, action) {  
		                Ext.MessageBox.alert("提示信息","请求失败,文件上传失败");  
		            }  
		        });  
		    }  
	}	
	function showRequest(){
		Ext.Ajax.request( {  
	        url : 'loginAction/getUploadPrcent.action',  
	        method : 'post',  
	       success: function(data, options){
	            	  Ext.getCmp("uploadWin").setTitle("上传文件:已经写入("+data.responseText+")");
	            	  if(data.responseText =='100%'){
	            	  	clearInterval(_interval);
	            	  	Ext.getCmp("uploadWin").setTitle("上传文件:写入完成,请稍等...");
	            	  	return;
	            	  }
	            	  m++ ;
	        } 
    });  
	
	}

   再贴监听方法:

 

  

public class UploadProgressListener implements ProgressListener {//要继承ProgressListener
	private double megaBytes = -1;  
    private HttpSession session;  
    public UploadProgressListener(HttpServletRequest request) {  
        session=request.getSession();  
    }  
    public void update(long pBytesRead, long pContentLength, int pItems) {  
        double mBytes = pBytesRead / 1000000;  
        double total=pContentLength/1000000;  
           if (megaBytes == mBytes) {  
               return;  
           }  
           System.out.println("total====>"+total);  
           System.out.println("mBytes====>"+mBytes);  
           megaBytes = mBytes;  
           System.out.println("megaBytes====>"+megaBytes);  
           System.out.println("We are currently reading item " + pItems);  
           if (pContentLength == -1) {  
               System.out.println("So far, " + pBytesRead + " bytes have been read.");  
           } else {  
               System.out.println("So far, " + pBytesRead + " of " + pContentLength  
                                  + " bytes have been read.");  
              double read=(mBytes/total);  
              NumberFormat nf=NumberFormat.getPercentInstance();  
              System.out.println("生成读取的百分比 并放入session中===>"+nf.format(read));//生成读取的百分比 并放入session中  
              session.setAttribute("readPrcnt", nf.format(read));  
           }  
    }  
	}

   再贴:上传dopost()方法:
  

public class fileUpload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public fileUpload() {
		super();
	}

	public void destroy() {
		super.destroy();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		//文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性
		boolean isMultipart = ServletFileUpload.isMultipartContent(request); //判断上传表单是否为multipart/form-data类型
		if (isMultipart) {  
		 // 创建磁盘工厂,利用构造器实现内存数据储存量和临时储存路径
		 DiskFileItemFactory factory=new DiskFileItemFactory(); 
		 factory.setSizeThreshold(4096);
	     // 设置文件临时存储路径
	     factory.setRepository(new File(System.getProperty("java.io.tmpdir")));  
	     // 产生一新的文件上传处理程式
	     ServletFileUpload upload = new ServletFileUpload(factory);  
	     ProgressListener progressListener = new UploadProgressListener(request);   
	     request.getSession().setAttribute("progress", progressListener);   
	     upload.setProgressListener(progressListener);
	     //文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性
	     upload.setSizeMax(1024 * 1024 * 100); // 设置允许用户上传文件大小,单位:字节
	     FileOutputStream out = null ;
	     InputStream in = null;
	    // 得到所有的表单域,它们目前都被当作FileItem
	     try {
	    	 	// 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
	    	    //upload对象是使用DiskFileItemFactory 对象创建的ServletFileUpload对象,并设置了临时文件路径 传输文件大小等等。
	    	    List<FileItem> list = upload.parseRequest(request);
	    	    Iterator it=list.iterator();
	    	    while(it.hasNext())
	    	    {
		    	    FileItem item=(FileItem)it.next();// 每一个item就代表一个表单输出项
		    	    String filename = item.getName();
		    	    if(item.getName() != null && !item.isFormField()){
			    	    // 得到上传文件的名称,并截取
		    	    	String savePath = this.getServletContext().getRealPath("/upload");//在WebRoot下面建了一个文件夹
		    	    	String extensionName = filename.substring(filename.lastIndexOf(".") + 1);//获取文件后缀名
			    	    out=new FileOutputStream(savePath+"\\"+ UUID.randomUUID()+"."+extensionName);
			    	    in = item.getInputStream();
			    	    byte buffer[] = new byte[1024];
			    	    int len = 0;
			    	    while((len=in.read(buffer))>0){
			    	    	out.write(buffer,0,len);
			    	    }
			    	    in.close();
			    	    out.close();
			    	    response.setContentType("text/html;charset=GB2312");
			    	    response.getWriter().print("{'success':true,'message':'上传成功'}"); 
		    	    } 
		    	    item.delete();
		    	}
	     }
	    	 catch (FileUploadException e) {
				e.printStackTrace();
			} finally{
				try{
					response.getWriter().close();
					in.close();
			    	out.close();
				}catch(Exception ex){
					System.out.println(ex);
				}
			} 
		}
	}

	public void init() throws ServletException {
		// Put your code here
	}

}

    web.xml servlet配置:

 

  

  <servlet>
    <servlet-name>fileUpload</servlet-name>
    <servlet-class>upload.fileUpload</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>fileUpload</servlet-name>
    <url-pattern>/servlet/fileUpload</url-pattern>
  </servlet-mapping>  

 

 

    

  • 大小: 16.9 KB
  • 大小: 15 KB
  • 大小: 16.4 KB
分享到:
评论

相关推荐

    Extjs+java+swf多文件上传进度条显示项目

    标题中的“Extjs+java+swf多文件上传进度条显示项目”是一个综合性的Web开发实践,涉及到前端的用户界面、后端的数据处理以及文件上传过程中进度反馈的实现。这个项目利用了Extjs库来构建用户界面,Java作为服务器端...

    extjs java 上传文件进度条

    总结来说,"extjs java 上传文件进度条"这个主题涉及到前端与后端的交互,需要理解ExtJS组件的使用,熟悉Ajax异步上传,掌握Java服务器处理文件上传的逻辑,以及HTTP协议、JSON通信等相关知识。通过这些技术的结合,...

    ExtJS4多文件上传,带进度条及管理

    本文将详细解析"ExtJS4多文件上传,带进度条及管理"这一主题,涵盖其核心概念、实现方式以及相关技术。 **一、ExtJS4概述** ExtJS4是Sencha公司推出的一个前端框架,它提供了丰富的组件库和强大的数据绑定机制,...

    extjs 进度条的显示

    本文将深入探讨如何在ExtJS中实现进度条的显示,这是一个在数据加载、文件上传或任何需要用户等待的任务中非常实用的功能。通过理解和应用以下知识点,你可以有效地在你的ExtJS项目中集成进度条,提升用户体验。 ##...

    Java+Extjs实现单文件上传

    4. **样式和用户体验**:可以自定义表单样式和行为,如显示上传进度条、提供取消上传的选项等,提升用户体验。 总结起来,Java+ExtJS实现单文件上传涉及的主要知识点包括:Java Servlet的Multipart处理、文件流操作...

    extjs swfupload .net 多文件带进度条上传

    【标题】"extjs swfupload .net 多文件带进度条上传"涉及的核心技术是前端的EXTJS框架、后端的ASP.NET平台以及中间的文件上传组件SWFUpload。这种组合允许用户在Web应用中实现批量文件上传并显示上传进度,提供了...

    ExtJS_可编辑Grid进度条

    在“ExtJS_可编辑Grid进度条”这个主题中,我们将深入探讨如何在Grid组件中实现可编辑的进度条功能,以及这一功能的实现原理和应用场景。 首先,我们要理解Grid的基本概念。Grid在ExtJS中是一个表格视图,用于展示...

    ExtJS3.4和VS2010上传文件的进度条

    标题中的“ExtJS3.4和VS2010上传文件的进度条”涉及的是一个使用ExtJS3.4版本的JavaScript库与Microsoft Visual Studio 2010(VS2010)进行文件上传,并在上传过程中显示进度条的功能。这个功能在Web应用程序中非常...

    extjs+swfupload实现多文件上传下载删除带进度条

    本篇将详细讲解如何利用`ExtJS`和`SwfUpload`来创建一个支持多文件上传、下载和删除,并带有进度条显示的系统。 `ExtJS`是一个基于JavaScript的UI框架,它提供了丰富的组件库和强大的数据绑定机制,可以构建出复杂...

    extjs 4.2 多文件上传

    用Ext编写的多文件上传组件,已封装。 支持多文件上传,文件下载,文件删除,

    ExtJS+ASP.NET实现真实的进度条显示

    3. 客户端交互:使用JavaScript(例如ExtJS)显示进度条,并定时轮询服务器获取进度更新。 这样的设计确保了用户在等待过程中能获取实时反馈,提高了系统的可用性和用户满意度。然而,需要注意的是,由于采用的是...

    ExtJS原生多文件拖动上传组件

    ExtJS原生多文件拖动上传组件 使用时修改包路径 1.多文件上传 2.支持拖动上传 3.支持图片压缩 4.支持图片合并 5.文件排序 可扩展实时图片预览 api //初始化画板 initCanvas //上传文件窗口 uploadWindow //初始化...

    swf+Extjs+java多文件上传项目

    【标题】"swf+Extjs+java多文件上传项目"是一个基于SwfUpload插件、ExtJS前端框架和Java后端技术实现的文件批量上传解决方案。该项目旨在提供一种高效、用户友好的文件上传体验,适用于需要处理大量文件上传需求的...

    ExtJS带进度条的多文件上传和图片预览

    在"ExtJS带进度条的多文件上传和图片预览"这个项目中,它展示了如何利用ExtJS来实现一个高效且用户友好的文件上传功能,尤其适用于处理大量或大体积的文件。下面将详细介绍这个项目中的关键知识点。 1. **ExtJS组件...

    ExtJs框架系列之ProgressGrid进度条

    在"ExtJs框架系列之ProgressGrid进度条"这个主题中,我们将深入探讨如何利用ExtJs框架中的特殊组件——ProgressColumn,来实现表格中显示动态进度条的功能。 ProgressColumn是Ext.ux.grid的一个扩展,它允许你在...

    EXTJS 多文件上传

    3. **进度条显示**:在文件上传过程中,EXTJS 提供了进度条来显示每个文件的上传进度,为用户提供实时反馈。 4. **错误处理**:如果某个文件上传失败,`MultiFileUploadField` 可以提供相应的错误提示,帮助用户...

    批量上传文件 EXTJS文件上传 上传组件

    在实际应用中,还需要考虑一些其他因素,如进度条显示、错误处理、文件类型限制、文件大小限制等。EXTJS提供了丰富的API和配置选项来支持这些功能。例如,可以通过监听FileField的`change`事件来实时更新文件列表,...

    extjs多文件上传

    2. **使用Plupload**:Plupload是一个跨浏览器的文件上传工具,支持多文件上传、队列管理、进度条显示、断点续传等功能。将其与ExtJS结合,可以增强文件上传体验。集成步骤包括创建Plupload实例,配置参数如URL、...

    ExtJS验证上传文件类型

    ExtJS 验证上传文件类型 ExtJS 中实现文件上传功能是非常方便的,但对于新手来说,控制文件上传类型是一个难题。例如,我们只想让用户上传特定的文件类型,例如txt文件,那么如何实现当用户上传非txt文件时,给出...

    jquery/extjs智能提示所需文件spket.7z

    这里提到的"jquery/extjs智能提示所需文件spket.7z"是一个压缩包,包含了帮助开发者在编写代码时实现智能提示功能的工具——Spket的配置和资源文件。 Spket是一款强大的JavaScript IDE插件,支持包括jQuery和ExtJS...

Global site tag (gtag.js) - Google Analytics