在Struts2中使用Uploadify组件上传文件
Uploadify是一个基于Jquery的文件上传组件,官网http://www.uploadify.com/可以在官网获得该组件,运行演示示例,下载帮助文档。
作为Web前端的增强技术,Jquery给用户以更好的体验和交互,增强富互联网客户端特效,而基于Jquery的Uploadify更是将文件上传效果发挥到极致。
一个项目下,需要开发一个上传文件的应用,项目基于Struts2,传统使用input标签的file属性上传是同步的,没有实时效果的。为了增强体验,一个偶然的机会让我发现了这个组件Uploadify。但是官方仅提供基于PHP的上传源码,那么在Struts2下的,就得自行研究了。
废话不多说,让我们一步一步领略Uploadify带来的不同感受。
1.支持的文件
jquery.js,jquery.uploadify.js,uploadify.css;怎获得就不多说了。
2.HTML页面源码
private File upload;//和HTML中input标记name同名 private String uploadFileName;//Struts2拦截器获得的文件名 public void setUpload(File upload) { this.upload = upload; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String uploadFile() throws Exception { //省略数据处理步骤 upload.renameTo(new File(realURL)); //省略数据库写入步骤 return "uploadFile"; }
private File upload;//和HTML中input标记name同名 private String uploadFileName;//Struts2拦截器获得的文件名 public void setUpload(File upload) { this.upload = upload; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String uploadFile() throws Exception { //省略数据处理步骤 upload.renameTo(new File(realURL)); //省略数据库写入步骤 return "uploadFile"; }
效果图
19
顶
顶
1
踩
踩
分享到:
增强型表格/报表-jqGrid使用浅析
- 2009-10-14 20:45
- 浏览 12483
- 评论(30)
- 收藏
- 分类:Web前端
- 相关推荐
10 楼 uestc2510 2009-11-13 引用
追加一个问题,用uploadify组件上传时,jsp中<input type="file" name="upload" id="upload" />里的name必须为"upload"吗?为什么我改成其他的名字(比如name="myFile",当然Action里的字段也跟着改)就上传不了,原因是在Action中this.getUploadFileName()是null。这是为什么呢?
9 楼 uestc2510 2009-11-13 引用
不好意思再次麻烦楼主。用uploadify上传时虽然上传成功了,但是控制台会报异常,内容如下:
Cannot create type class java.io.File from value Submit Query - [unknown location]
....省略一些,挑关键的
at java.lang.Thread.run(Thread.java:619)
2009-11-13 00:17:48 [com.opensymphony.xwork2.ognl.OgnlValueStack]-[WARN] Error setting expression 'Upload' with value '[Ljava.lang.String;@ff5d3f'
ognl.MethodFailedException: Method "setUpload" failed for object com.ttni.haveFun.Action.upload.FileUploadAction@1e229be [java.lang.NoSuchMethodException: com.ttni.haveFun.Action.upload.FileUploadAction.setUpload([Ljava.lang.String;)]
如果楼主有耐心看的话,这些异常信息里的"upload"就是我在jsp中<input type="file" name="upload" id="upload" />里的字段,setUpload()为其在Action中的setter方法。虽然不影响上传和DB的写入,但报异常终究不是好事。这个问题困扰了我好几天,请楼主帮忙。不知你有没有遇到过这个异常情况。
Cannot create type class java.io.File from value Submit Query - [unknown location]
....省略一些,挑关键的
at java.lang.Thread.run(Thread.java:619)
2009-11-13 00:17:48 [com.opensymphony.xwork2.ognl.OgnlValueStack]-[WARN] Error setting expression 'Upload' with value '[Ljava.lang.String;@ff5d3f'
ognl.MethodFailedException: Method "setUpload" failed for object com.ttni.haveFun.Action.upload.FileUploadAction@1e229be [java.lang.NoSuchMethodException: com.ttni.haveFun.Action.upload.FileUploadAction.setUpload([Ljava.lang.String;)]
如果楼主有耐心看的话,这些异常信息里的"upload"就是我在jsp中<input type="file" name="upload" id="upload" />里的字段,setUpload()为其在Action中的setter方法。虽然不影响上传和DB的写入,但报异常终究不是好事。这个问题困扰了我好几天,请楼主帮忙。不知你有没有遇到过这个异常情况。
8 楼 sarin 2009-11-11 引用
flyingcai 写道
此组件,是否为多线程上线呢?
可以这么理解,多文件提交测试是没问题的,我设置是3个,太多也没必要吧,还得根据项目来看,sttuts2在请求到达时就创建action对象对其响应啊。不是struts1那样单例的,所以线程是安全的。
7 楼 sarin 2009-11-11 引用
uestc2510 写道
还有个问题想问下楼主,uploadify上传时的进度条为什么是在程序进入action类之前就显示了100%,莫非它的进度是指将上传的文件复制到服务器的临时文件的进度?
本地测试速度非常快,建议用比较大的文件做测试。一般在action中我先将文件放到指定位置后,再写数据库,避免文件上传失败,数据库有记录。
6 楼 sarin 2009-11-11 引用
()方法,执行里面的代码,但用uploadify插件这样弄不行,不知道为什么。如果不用uploadify插件,直接上传,用我说的方法
我一般在action包中抽象出一个action基类,继承ActionSupport,覆盖execute()方法,用于返回SUCCESS,保证方法都能顺利执行。在具体实现类中写具体方法,如果不使用!格式的提交请求,在action标签配置method即可。我是用的!写法,上传没问题的
uestc2510 写道
太感谢你了,楼主。按照你的方法,我成功了!
我以前的写法是actionl类继承ActionSupport类,执行上传的代码也是写在execute()里的,理应这种写法不用在struts.xml里指定method="xx",struts2会默认找到execute()方法,执行里面的代码,但用uploadify插件这样弄不行,不知道为什么。如果不用uploadify插件,直接上传,用我说的方法又是可以的。
可用是uploadify插件不支持这种种写法吧。
最后,还是要感谢楼主的热心帮助。
我以前的写法是actionl类继承ActionSupport类,执行上传的代码也是写在execute()里的,理应这种写法不用在struts.xml里指定method="xx",struts2会默认找到execute()方法,执行里面的代码,但用uploadify插件这样弄不行,不知道为什么。如果不用uploadify插件,直接上传,用我说的方法又是可以的。
可用是uploadify插件不支持这种种写法吧。
最后,还是要感谢楼主的热心帮助。
我一般在action包中抽象出一个action基类,继承ActionSupport,覆盖execute()方法,用于返回SUCCESS,保证方法都能顺利执行。在具体实现类中写具体方法,如果不使用!格式的提交请求,在action标签配置method即可。我是用的!写法,上传没问题的
5 楼 flyingcai 2009-11-11 引用
此组件,是否为多线程上线呢?
4 楼 uestc2510 2009-11-10 引用
还有个问题想问下楼主,uploadify上传时的进度条为什么是在程序进入action类之前就显示了100%,莫非它的进度是指将上传的文件复制到服务器的临时文件的进度?
3 楼 uestc2510 2009-11-10 引用
太感谢你了,楼主。按照你的方法,我成功了!
我以前的写法是actionl类继承ActionSupport类,执行上传的代码也是写在execute()里的,理应这种写法不用在struts.xml里指定method="xx",struts2会默认找到execute()方法,执行里面的代码,但用uploadify插件这样弄不行,不知道为什么。如果不用uploadify插件,直接上传,用我说的方法又是可以的。
可用是uploadify插件不支持这种种写法吧。
最后,还是要感谢楼主的热心帮助。
我以前的写法是actionl类继承ActionSupport类,执行上传的代码也是写在execute()里的,理应这种写法不用在struts.xml里指定method="xx",struts2会默认找到execute()方法,执行里面的代码,但用uploadify插件这样弄不行,不知道为什么。如果不用uploadify插件,直接上传,用我说的方法又是可以的。
可用是uploadify插件不支持这种种写法吧。
最后,还是要感谢楼主的热心帮助。
2 楼 sarin 2009-11-10 引用
uestc2510 写道
楼主你好,我在Struts2中使用Uploadify组件上传文件遇到了问题,配置项'script':'xx.action',但是debug是怎么也进不了Action,(说明一下Struts2的配置是没问题的,因为我不用Uploadify组件直接上传时成功了的),请问是什么原因?
如果是XX.action不是XX!XX.action,则在配置文件<action>中需要添加method属性,且值是XX,Action类也必须有XX方法。还有该方法必须是post提交的
不知道您是不是这个意思</action>
1 楼 uestc2510 2009-11-09 引用
楼主你好,我在Struts2中使用Uploadify组件上传文件遇到了问题,配置项'script':'xx.action',但是debug是怎么也进不了Action,(说明一下Struts2的配置是没问题的,因为我不用Uploadify组件直接上传时成功了的),请问是什么原因?
相关推荐
wangdoudou0 2014-01-18
中等偏下 2015-04-14
yanyiping 2015-06-03
zfjdoreen 2015-08-24
clayluo 2017-06-05
selt 2017-09-28
梦回forever 2012-03-21
xxglh 2012-01-06
changsongzi 2013-02-20
中等偏下 2017-09-28
玫瑰余香000 2017-06-05
luochaotj 2015-08-26
88403861 2015-08-24
luyou0 2015-06-04
83457317 2015-06-03
中等偏下 2015-05-07
selt 2015-04-14
懒猫猫IT 2015-01-26
苗疆三刀的随手记 2014-11-18
评论
原理上是可以的,不过2G文件通过HTTP方式传输的可靠性,您认为如何?
但是有一个问题,在IE6-9一切正常,但是我用firefox,不调用'script' : 'disk!uploadFile.action', 中的action,半天没找出原因,希望楼主抽空看下。
这个action是struts2的请求
但是有一个问题,在IE6-9一切正常,但是我用firefox,不调用'script' : 'disk!uploadFile.action', 中的action,半天没找出原因,希望楼主抽空看下。
<input id="upload" name="upload" type="file" />
看不见了;但是要是去掉 $(document).ready(function() {...} 这一块js代码,
上传元素就出现在页面了。不知道为什么,很奇怪。
望楼主赐教!
一样的问题
这是jquery在页面准备好时执行的代码,可能是后面还未加载完全,这里不适合使用。去掉就行了
<input id="upload" name="upload" type="file" />
看不见了;但是要是去掉 $(document).ready(function() {...} 这一块js代码,
上传元素就出现在页面了。不知道为什么,很奇怪。
望楼主赐教!
一样的问题
<input id="upload" name="upload" type="file" />
看不见了;但是要是去掉 $(document).ready(function() {...} 这一块js代码,
上传元素就出现在页面了。不知道为什么,很奇怪。
望楼主赐教!
'script' : 'disk!uploadFile.action'
这个!是什么意思,怎么不是/,前面的 disk 是一个命名空间的名称么?看不懂。
还有
你给的Action的代码太少了点,能不能给一些“如何使用上传组件对文件进行处理”的代码啊?
谢谢!
我用了以后,文件不上传了。
<form>的method必须是post,enctype属性是multipart/form-data
处理时选择上传组件对文件进行处理即可。其他参数getParameter()就能获取到
Cannot create type class java.io.File from value Submit Query - [unknown location]
....省略一些,挑关键的
at java.lang.Thread.run(Thread.java:619)
2009-11-13 00:17:48 [com.opensymphony.xwork2.ognl.OgnlValueStack]-[WARN] Error setting expression 'Upload' with value '[Ljava.lang.String;@ff5d3f'
ognl.MethodFailedException: Method "setUpload" failed for object com.ttni.haveFun.Action.upload.FileUploadAction@1e229be [java.lang.NoSuchMethodException: com.ttni.haveFun.Action.upload.FileUploadAction.setUpload([Ljava.lang.String;)]
如果楼主有耐心看的话,这些异常信息里的"upload"就是我在jsp中<input type="file" name="upload" id="upload" />里的字段,setUpload()为其在Action中的setter方法。虽然不影响上传和DB的写入,但报异常终究不是好事。这个问题困扰了我好几天,请楼主帮忙。不知你有没有遇到过这个异常情况。
这个问题只能修改参数名不用upload,它好像是系统保留字一样,使用就会有这种问题。
我写的代码和楼主写的思路是一样的
但是遇到一个问题
对于script配置项,目前和楼主一样测试通过的 是相同namespace下的action
但是对于跨namespace的就不知道为什么不行了,进不了Action的
假设我现在的namespace是mail ,url是 /xxx/mail/mail.action
我将FileAction放到与MailAction相同的namespace下,按照下面的写法,是没有问题的
但是如果我将FileAction转移到其专有的namespace:file的话,利用下面的任何一种种写法都是不行的
望楼主赐教
跨命名空间的测试我还没有测试这个组件,但是在以往的项目中,我是在xml配置action时,class属性就跨了,但是不跨页面的namespace。您可以这样试试,此时在action中加入method属性就应该可以了。
我写的代码和楼主写的思路是一样的
但是遇到一个问题
对于script配置项,目前和楼主一样测试通过的 是相同namespace下的action
但是对于跨namespace的就不知道为什么不行了,进不了Action的
假设我现在的namespace是mail ,url是 /xxx/mail/mail.action
我将FileAction放到与MailAction相同的namespace下,按照下面的写法,是没有问题的
但是如果我将FileAction转移到其专有的namespace:file的话,利用下面的任何一种种写法都是不行的
望楼主赐教
如果没有进入action方法,肯定是配置文件的问题了,不妨贴出来看看。这个项目是研究项目,我不方便贴全代码的
'fileDataName' : 'upload', 这个js段也得改啊,因为最终是js上传的。
异步传输的时候因为struts2的action不需要返回结果来显示,把上传方法返回值设成null即可,不设置null,那么在xml配置文件不要写result标签。这只是异步处理的方法,不需要用视图来响应请求