最近给公司开发项目中,一直在做一个上传功能,在做这个功能中对上传组件的使用感触挺深的。
我最早使用的一款上传组件是fileupload,不是struts的,是servlet的,它是在serlvet中使用的,在后台要写好多好多的代码,感觉那个太繁琐了,之后又使用了swf上传组件,这个组件的上传功能是在前台实现的,在前台就可以实现上传而且还可以实现动态上传的进度条,给人的视觉感觉很不错。但是,它是将flash和js封装在一起的,由于要先前台实现上传,所以很多东西写的比较复杂,想要掌握它并熟悉它需要花费大量的时间去研究它,而且很难把握住,出了问题也不好调试。。。。
最终在我尝试好多的上传组件中,我选择了fileupload上传组件。首先是前台它是用jquery和ajax实现的,大家先可以看一下前台代码:
function ajaxFileUpload()
{ $("#loading") .ajaxStart(function(){ $(this).show(); })//开始上传文件时显示一个图片 .ajaxComplete(function(){ $(this).hide(); });//文件上传完成将图片隐藏起来 $.ajaxFileUpload ( { url:'fileUploadAction.action',//用于文件上传的服务器端请求地址 secureuri:false,//一般设置为false fileElementId:'file',//文件上传空间的id属性 <input type="file" id="file" name="file" /> dataType: 'json',//返回值类型 一般设置为json success: function (data, status) //服务器成功响应处理函数 { alert(data.message);//从服务器返回的json中取出message中的数据,其中message为在struts2中定义的成员变量 if(typeof(data.error) != 'undefined') { if(data.error != '') { alert(data.error); }else { alert(data.message); } } }, error: function (data, status, e)//服务器响应失败处理函数 { alert(e); } } ) return false;}
这是ajax的方法写的组件中的方法,前台只需写一个简单的input的text框和一个简单的buttton按钮,然后通过jquery调用就可以实现。
然后给大家看一下后台代码:
String path = ServletActionContext.getRequest().getRealPath("/upload");try {
File f = this.getFile(); if(this.getFileFileName().endsWith(".exe")){ message="对不起,你上传的文件格式不允许!!!"; return ERROR; } FileInputStream inputStream = new FileInputStream(f); FileOutputStream outputStream = new FileOutputStream(path + "/"+ this.getFileFileName()); byte[] buf = new byte[1024]; int length = 0; while ((length = inputStream.read(buf)) != -1) { outputStream.write(buf, 0, length); } inputStream.close(); outputStream.flush(); } catch (Exception e) { e.printStackTrace(); message = "对不起,文件上传失败了!!!!"; } return SUCCESS;}
后台只需要一个简单的输入输出流就可以实现,将你要上传的文件通过前台的ajax提交到对应的action类。是不是很简单?比起很多方法它要简单的多,类型除了.exe的文件都可以上传。但是使用的过程是要注意一点,使用的时候,要注意它也是基于struts的基础上来实现的,所以再你使用这个组件之前你得搭配好struts 2的配置环境,而且jar包何总必须有struts2-json-puligun.jar这个包,大家使用的时候一定要多注意。