最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
java中struts2实现文件上传下载功能
时间:2014-05-30 编辑:简简单单 来源:一聚教程网
1.文件上传
首先是jsp页面的代码
在jsp页面中定义一个上传标签
代码如下 | 复制代码 | |
附件: |
然后是BaseAction中定义的相关属性其它的就省略了(也可定义在自己的Action,换下访问修饰符即可)
代码如下 | 复制代码 |
/** protected List } |
然后是Action中的一个上传方法,代码如下:
代码如下 | 复制代码 |
/** |
接着是我的struts2.xml文件
代码如下 | 复制代码 |
|
savePath为保存路径,fileUpload.allowedTypes 用来限制上传文件类型 fileUpload.maximumSize 文件大小限制
2.文件下载
首先是页面中的下载链接
代码如下 | 复制代码 | |
附件: | ${item.accessory} |
接着是DownloadAction的代码:
代码如下 | 复制代码 |
/** /** private static Logger logger = Logger.getLogger(DownloadAction.class); private String filename; public InputStream getInputStream() { public void setInputStream(InputStream inputStream) { @Override /*************************** get set ******************************/ public void setSavePath(String savePath) { public String getFilename() { public void setFilename(String filename) { |
然后是它的struts2.xml文件:
代码如下 | 复制代码 |
E:/upload ${mimeType} attachment;filename="${filename}" inputStream |
下载的话注意下编码格式基本应该就没什么问题了.
上传过程碰到的问题
1.上传大文件就出错解决方法1
出现的错误有如下:
1、2012-02-24 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - Could not find action or result
No result defined for action com.iman.portal.action.QuestionActionImpl and result problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51:55
2、the request was rejected because its size (2973652) exceeds the configured maximum (2097152)
中文意思: 要求被拒绝,因为它的大小(2973652)超过配置的最大值(2097152)、
考虑到用户体验,所以必须在上传附件时,拦截这样的异常,解决方法如下:
1、所上传的文件,在上传过程中都是先存放在缓存中的,安全起见,还是在项目的struts.properties文件中,加一个临时存放路径,虽然项目中己经设置好服务器的物理路径。
代码如下 | 复制代码 |
struts.multipart.saveDir=/temp |
2、考虑到后期可能会修改文件上传的大小,所以不管是否默认,还是在项目的struts.properties文件中,加如下配置:
代码如下 | 复制代码 |
|
3、struts.xml配置
代码如下 | 复制代码 |
|
4、最重要也是最关键的一步
fileUpload拦截器只是当文件上传到服务器上之后,才进行的文件类型和大小判断。在Action中如果我们什么操作都不做的话,异常就会展现在用户的面前,因此想了一个方法,把该异常信息设置为Action级别的错误信息。即重写addActionError方法。
代码如下 | 复制代码 |
@Override public void addActionError(String anErrorMessage) { // 这里要先判断一下,是我们要替换的错误,才处理 if (anErrorMessage.startsWith("the request was rejected because its size")) { Pattern pattern = Pattern.compile("d+"); Matcher m = pattern.matcher(anErrorMessage); // 匹配一次 m.find(); String s1 =m.group();//上传的文件大小 // 再匹配一次 m.find(); String s2 =m.group();//所限制的大小 if(!s1.equals("") && !s2.equals("")){ fileUploadErrorMessage="你上传的文件大小(" + Long.valueOf(s1)/1024 +"字节)超过允许的大小(" + Long.valueOf(s2)/1024/1024 + "M)"; getRequest().setAttribute("fileUploadErrorMessage","文件太大,超过了允许的大小("+Long.valueOf(s2)/1024/1024+"M),上传失败!"); // 将信息替换掉 super.addActionError(fileUploadErrorMessage); } } else {// 否则按原来的方法处理 super.addActionError(anErrorMessage); } } 可以,在返回页面用 因为我不打算,在页面上显示出来错误原因,想弹出一个提示框,所以将信息放入了request对象中。 而页面加载时,加了如下js验证: //判断 文件是否上传成功 var message="${request.fileUploadErrorMessage}"; if(message!=null && ""!=trim(message) && message!="null"){ self.parent.diag.close(); alert(message); return; } |
下面是一些参考了解东东:
struts.multipart.maxSize掌控整个项目所上传文件的最大的Size
struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不同,总结如下:
1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。
超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。
3.当上传的文件大于struts.multipart.maxSize时,系统报错
当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
当上传的文件小于maximumSize,上传成功。
/data
52428800
上传大文件就出错解决办法2
问题:上传大文件报错……
解决:修改struts.xml文件中的参数如下
代码如下 | 复制代码 |
|
struts.xml文件中的大小与实际文件大小的关系:1048576(Bytes) = 1024*1024 = 1M实际文件大小.
struts.multipart.maxSize掌控整个项目所上传文件的最大的Size
struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不同,总结如下:
1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。
3.当上传的文件大于struts.multipart.maxSize时,系统报错
当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
当上传的文件小于maximumSize,上传成功。
上传文件的类型限制
配置fileupload拦截器
struts2的defaultStack中已经含有fileupload拦截器,如果想加入allowedTypes参数,需要从新写一个defaultstack ,拷贝过来修改一下即可:
代码如下 | 复制代码 |
image/png,image/gif,image/jpeg dojo..*,^struts..* input,back,cancel,browse input,back,cancel,browse 仅修改代码中的 image/png,image/gif,image/jpeg |
拦截器栈在
代码如下 | 复制代码 |
文件上传类型错误action会直接返回input,所以不需要在action中return "input" ;
还可以在
代码如下 | 复制代码 |
|
最最最重要的一点:上传文件的表单 必须加上:enctype="multipart/form-data" 不加必然报input错误。
-
下一个: java线程超时设置方法
相关文章
- Laravel 5.2文件上传的功能使用示例 08-27
- WebUploader文件上传组件示例 08-24
- Plupload上传组件 + java实现文件上传例子 05-13
- Swift HTTP网络操作库Alamofire实现文件上传详解 12-09
- SWFObject文件上传插件的使用教程 10-09
- SWFUpload文件上传插件用法详解 06-08