java利用SWFUpload实现文件批量上传
之前在网上找过很多相关资料,很多所谓的批量上传都是忽悠人的,真正的批量上传指的是用户一次性可以选择多个文件,然后上传是将所有选取的文件上传到服务器。java中真正可以实现批量上传的技术大致有两种:一种是通过flash;一种是通过applet;不过html5也可以支持批量拖选。两种方式有各自的优缺点,其中flash对于浏览器兼容性较好,基本可以满足市面上大众浏览器,缺点就是对于上传文件大小有限制,如果用户只需要上传一些图片或者文档文件的话,这种选择还是比较理想的;applet方式可以上传大文件,但是需要浏览器支持jdk并安装相关插件。
今天这个项目采用的是flash方式。整体设计思路:采用ext+swfupload进行上传界面显示,后台采用strust2来处理上传文件。
最终项目运行效果图如下:
前台jsp文件源码index.jsp:
- <%@pagecontentType="text/html;charset=gb2312"language="java"%>
- <html>
- <head>
- <title>swf上传</title>
- <linkrel="stylesheet"type="text/css"
- href="js/css/ext-all.css"/>
- </head>
- <body>
- <scripttype="text/javascript"src="js/ext-base.js"></script>
- <scripttype="text/javascript"src="js/ext-all.js"></script>
- <scriptsrc="swf/swfupload.js"type="text/javascript"></script>
- <scriptsrc="swf/swfupload.speed.js"type="text/javascript"></script>
- <scriptsrc="swf/mode.js"type="text/javascript"></script>
- <scriptsrc="swf/handlers.js"type="text/javascript"></script>
- <scripttype="text/javascript"src="js/prototype/prototype.js"></script>
- <scripttype="text/javascript"src="js/bramus/jsProgressBarHandler.js"></script>
- <scripttype="text/javascript">
- //允许上传文件的全部大小
- varlimtallsize=50000000;
- functionUploadGrid()
- {
- varmine=this;
- varstates=[{v:-1,t:'等待'},{v:0,t:'就绪'},{v:1,t:'上传中'},{v:2,t:'停止'},{v:3,t:'成功'},{v:4,t:'失败'}];
- functionstatesRender(v)
- {
- for(vari=0;i<states.length;i++)
- {
- if(states[i].v==v)
- {
- returnstates[i].t;
- }
- }
- }
- functionrateRender(value,metaData,record,rowIndex,cellIndex,store)
- {
- v=value?value:0;
- //return"<tableborder='0'cellpadding='0'cellspacing='0'width='100%'height='100%'><tr><tdbgcolor='#0000FF'height='100%'align='center'width='"+v+"%'><fontcolor='white'>"+v+"%</font></td><td></td></tr></table>";
- //setProgress(v);
- return"<spanid=\"element6_"+record.data.id+"\"rate=\""+v+"\"></span>";
- }
- varrn=newExt.grid.RowNumberer();
- varsm=newExt.grid.CheckboxSelectionModel({singleSelect:false});
- varcm=newExt.grid.ColumnModel([
- rn,
- sm,
- {header:'文件名称',dataIndex:'fileName',menuDisabled:true,width:100},
- {header:'大小',dataIndex:'fileSize',menuDisabled:true,width:100},
- {header:'进度',dataIndex:'rate',menuDisabled:true,width:180,renderer:rateRender},
- {header:'速度',dataIndex:'speed',menuDisabled:true},
- {header:'状态',dataIndex:'state',menuDisabled:true,renderer:statesRender}
- ]);
- this.ds=newExt.data.Store({
- proxy:newExt.data.HttpProxy({url:'test!query.action',method:'post'}),
- remoteSort:false,
- reader:newExt.data.JsonReader(
- {totalProperty:'records',root:'root'},
- [
- {name:'id'},
- {name:'fileName'},
- {name:'code'},
- {name:'fileSize'},
- {name:'rate'},
- {name:'speed'},
- {name:'state'}
- ])
- });
- varRC=Ext.data.Record.create([
- {name:'id',mapping:'id'},
- {name:'code',mapping:'code'},
- {name:'fileName',mapping:'fileName'},
- {name:'fileSize',mapping:'fileSize'},
- {name:'rate',mapping:'rate'},
- {name:'speed',mapping:'speed'}
- ]);
- this.grid=newExt.grid.GridPanel({
- ds:mine.ds,
- cm:cm,
- sm:sm,
- anchor:'100%',
- loadMask:{msg:'数据加载中...'},
- viewConfig:{forceFit:true},
- height:300,
- width:600,
- tbar:[{id:'spanSWFUploadButton',text:'-'},'-'],
- listeners:{
- render:function()
- {
- //ytb-sep
- varcmp=Ext.getCmp("spanSWFUploadButton");
- varpcont=cmp.getEl().parent();
- pcont.update("<spanid='spanSWFUploadButton'class='blank'></span>");
- varswfu=newSWFUpload({
- upload_url:"upload.action",
- post_params:{
- "god":"god","uid":"u"
- },
- flash_url:"swf/swfupload.swf",
- button_placeholder_id:"spanSWFUploadButton",
- button_image_url:"swf/bt.png",
- button_text_right_padding:100,
- button_width:61,
- button_height:22,
- button_action:SWFUpload.BUTTON_ACTION.SELECT_FILES,
- //handlerhere
- swfupload_loaded_handler:Handlers.swfUploadLoaded,
- file_queued_handler:Handlers.fileQueued,
- file_queue_error_handler:Handlers.fileQueueError,
- upload_progress_handler:Handlers.uploadProgress,
- upload_error_handler:Handlers.uploadError,
- upload_success_handler:Handlers.uploadSuccess
- });
- swfu.grid=mine.grid;
- swfu.ds=mine.ds;
- swfu.RC=RC;
- }
- }
- });
- }
- Ext.onReady(function(){
- Ext.QuickTips.init();
- Ext.form.Field.prototype.msgTarget='side';
- Ext.BLANK_IMAGE_URL='../../images/s.gif';
- vargrid=newUploadGrid();
- varwin=newExt.Window({
- title:'上传表格测试',
- el:'panel',
- width:620,
- height:350,
- closeAction:'hide',//关闭窗口时渐渐缩小
- plain:true,
- items:[grid.grid],
- buttons:[{
- text:'Submit',
- disabled:true
- },{
- text:'Close',
- handler:function(){
- win.hide();
- }
- }]
- });
- win.show(this);
- })
- </script>
- <divid="panel"></div>
- </body>
- </html>
后台UploadAction.java:
- packageupload.action;
- importjava.io.File;
- importjava.text.DateFormat;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importorg.apache.struts2.ServletActionContext;
- publicclassUploadAction
- {
- privateFileFiledata;
- privateStringFiledataFileName;
- privateStringFiledataContentType;
- //文件夹目录
- privatestaticfinalStringbasePath="fileupload\\groupResource";
- publicStringexecute()
- {
- Strings=(String)ServletActionContext.getRequest().getParameter("god");
- Strings2=(String)ServletActionContext.getRequest().getParameter("uid");
- if(Filedata!=null&&Filedata.length()>0)
- {
- //群组名字作为最后的文件夹
- StringgroupFileName="haoba";
- StringuploadPath=ServletActionContext.getServletContext()
- .getRealPath(basePath+"\\"+groupFileName);
- Filepath=newFile(uploadPath);
- if(!path.exists())
- {
- path.mkdirs();
- }else{
- //文件已存在
- //FiledataFileName
- }
- StringnewPath=uploadPath+"\\"+FiledataFileName;
- Filedata.renameTo(newFile(newPath));
- //保存到数据库中的路径
- StringsavePath=basePath+"\\"+groupFileName+"\\"+FiledataFileName;
- }
- returnnull;
- }
- //上传文件
- privateStringpathSplit(StringtimeStr,Stringo,Stringn)
- {
- StringBuffersb=newStringBuffer();
- for(Stringa:timeStr.split(o))
- {
- sb.append(a);
- sb.append(n);
- }
- sb.deleteCharAt(sb.length()-1);
- returnsb.toString();
- }
- publicstaticStringformat(Datedate,Stringparttern)
- {
- DateFormatdf=newSimpleDateFormat(parttern);
- returndf.format(date);
- }
- publicFilegetFiledata()
- {
- returnFiledata;
- }
- publicvoidsetFiledata(Filefiledata)
- {
- Filedata=filedata;
- }
- publicStringgetFiledataFileName()
- {
- returnFiledataFileName;
- }
- publicvoidsetFiledataFileName(StringfiledataFileName)
- {
- FiledataFileName=filedataFileName;
- }
- publicStringgetFiledataContentType()
- {
- returnFiledataContentType;
- }
- publicvoidsetFiledataContentType(StringfiledataContentType)
- {
- FiledataContentType=filedataContentType;
- }
- publicstaticvoidmain(String[]args){
- System.out.println(0.444<1);
- }
- }
源码免费下载地址:http://dl.vmall.com/c0lmx5394j
swfupload控件使用指南:http://dl.vmall.com/c0s0bbqp5i