哪位有Webwork关于文件上传的例子。 要求点击图片之后,文件能在窗口预览。就这么简单,在线等 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用JS就可以实现<script language="javascript"> function preview(obj,div) { div.innerhtml = "<img src='"+obj.value+"'"> }</script><body> <form ...> <input type="file" onchange="javascript:preview(this,'preimg')"> <div id="preimg"> </div> </form></body> 用JS就可以实现<script language="javascript"> function preview(obj,div) { div.innerhtml = "<img src='"+obj.value+"'"> }</script><body> <form ...> <input type="file" onchange="javascript:preview(this,'preimg')"> <div id="preimg"> </div> </form></body> 1.先插入一个上传表单控件和一隐藏的空白图片。 <input type="file" id="upload"> <img id="pic" style="display:none"> 2.在上传控件的属性改变(本例中为选择文件后),设置隐藏图片的地址为所选择的文件地址。 <script for="upload" event="onpropertychange"> pic.src=this.value </script> 3.在隐藏图片加载完后显示。 <script for="pic" event="onload"> this.style.display="" //以行内元素方式显示隐藏的图片 </script> 4.如果所选择文件不是图片格式或者路径不正确,触发onerror事件,隐藏图片并弹出警告框。 <script for="pic" event="onerror"> //当 id 为 pic 的对象在装载过程中发生错误时触发此段代码 this.style.display="none" //隐藏图片 alert("所选文件并非图片,请重新选择") </script> 5.完整代码。 <script for="upload" event="onpropertychange"> //当 id 为 upload 的对象上的属性发生变化时调用此段代码 //设置隐藏图片的地址为上传控件框的值 pic.src=this.value </script> <script for="pic" event="onload"> //当 id 为 pic 的对象在装载完成时触发此段代码 this.style.display="" //以行内元素方式显示隐藏的图片 </script> <script for="pic" event="onerror"> //当 id 为 pic 的对象在装载过程中发生错误时触发此段代码 this.style.display="none" //隐藏图片 alert("所选文件并非图片,请重新选择") </script> <input type="file" id="upload"> <img id="pic" style="display:none"> 技巧:显示对象除了设置display为空,还可以设为 inline 和 block WebWork利用ognl实现的资料绑定是非常实用的功能, 能够避免繁琐调用request.getParameter, object setter, 也不需要任何的多余配置文件, 再加上转换器的功能( http://forum.javaeye.com/viewtopic.php?t=10507 ), 我们就可以用一个业务对象, 从前台一直串到后台, 再也不需要考虑String转化, 不需要DTO, 不需要FormBean了. 如果能够把web应用上常见的上传文件也用数据绑定来实现, 那么就是非常完美了: action再也不需要了解任何web信息, 需要对具体的Object进行操作, 就调用getObject, 需要对用户上传的文件进行操作, 就调用getFile. 在webwork2.1.5以前, wiki上有一篇文档: http://wiki.opensymphony.com/display/WW/File+Upload+Interceptor, 介绍了如何实现这种做法, 在2.1.5以后, 这个拦截器被加入了正式release版本里面: com.opensymphony.webwork.interceptor.FileUploadInterceptor 先来看一下我们的Action: 代码public class Upload implements Action { private File[] uploadFiles; public String execute() throws Exception { //store uploadFiles ... } public void setUploadFiles(File[] uploadFiles) { this.uploadFiles = uploadFiles; } } 我们可以看到这个Action相当的简单, 只要定义一个File类型的属性以及setter, 我们就可以用这个File对象来作任何事情了. 页面和普通的upload页面没有区别: 代码<form .... enctype="multipart/form-data"> .... File 1: <input type="file" name="uploadFiles"> File 2: <input type="file" name="uploadFiles"> <form> 需要注意栏位名称和Action的属性同名就可以了, 剩下的事情就是配置拦截器: xml 代码<interceptors> <interceptor name="upload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/> <interceptor-stack name="uploadStack"> <interceptor-ref name="upload"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="doUpload" class="yourPackage.Upload"> <interceptor-ref name="uploadStack"/> <result name="success">...</result> </action> 除此之外, 这个拦截器还提供了额外的信息: ContentType和FileName供我们使用: [File Name]ContentType: 文件的ContentType(可以用在做download的时候) [File Name]FileName: 实际的文件名 在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName这2个属性, 也能够被自动绑定. 具体的代码可以参考webwork的upload example 结论:灵活运用拦截器可以让原本复杂,繁琐的工作变得轻松,简单. 另补充几点: webwork的文件上传实际上是封装了几种通用的File Upload lib,并不是自己实现的,这它包括了pell,cos,apache common三种实现。 cos是oreilly的包,访问地址在http://servlets.com cos包的功能是最全面的,也是我最喜欢用的文件上传lib apache common 是apache的common中的一个 pell的来源我没有考证过。 webwork对这三个包的封装有些类似apache common logging,提供了一个通用的访问接口,至于具体用什么,则在webwork.properties中配置。 就我的经验来看,如果你直接使用Webwork的FileUpload拦截器,我一定推荐你使用pell,因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名,而cos会乱码,因此我们唯一的选择只有pell。 我不了解pell和apache common,但是webwork的封装丧失了很多cos的功能。cos需要设置request的character encoding,但是webwork的封装没有设置,所以就导致了cos的乱码问题,当然如果你单独使用cos,则会避免此类问题。 在webwork的file upload 拦截器功能中,它提供的File只是一个临时文件,Action执行之后就会被自动删除,因此你必须在Action中自己出来文件的存储问题,或者写到服务器的某个目录,或者保存到数据库中。如果你准备写到服务器的某个目录下面的话,你必须自己面临着处理文件同名的问题,但是实际上cos包已经提供了文件重名的自动重命名规则。 因此我的建议是不复杂的应用直接使用webwork的拦截器,复杂的应用自己写拦截器调用cos来完成。 JSP页面将变化的内容存到数据库里怎么做呢 菜鸟请教,一个留言板程序... 两个ACTION之间request.getParameter得不到值!!!!! 紧急求助:外国时间代码 java.lang.NoSuchMethodError 关于数据库连接的一个问题 为什么我的rs.next()的值总是false,可是我的数据库中有数据的!我想实现的功能是验证用户名密码! 求聊天室源码!!分不够再加! 有谁能告诉我javax.servlet包在哪里有! 关于jspsmartupload的问题,请大家帮下手 MYeclipse6.0 jsp新手,这个中文字符转换程序,运行老是出错~~高手进来看!
<script language="javascript">
function preview(obj,div) {
div.innerhtml = "<img src='"+obj.value+"'">
}
</script><body>
<form ...>
<input type="file" onchange="javascript:preview(this,'preimg')">
<div id="preimg">
</div>
</form>
</body>
<script language="javascript">
function preview(obj,div) {
div.innerhtml = "<img src='"+obj.value+"'">
}
</script><body>
<form ...>
<input type="file" onchange="javascript:preview(this,'preimg')">
<div id="preimg">
</div>
</form>
</body>
<img id="pic" style="display:none"> 2.在上传控件的属性改变(本例中为选择文件后),设置隐藏图片的地址为所选择的文件地址。 <script for="upload" event="onpropertychange">
pic.src=this.value
</script> 3.在隐藏图片加载完后显示。 <script for="pic" event="onload">
this.style.display="" //以行内元素方式显示隐藏的图片
</script> 4.如果所选择文件不是图片格式或者路径不正确,触发onerror事件,隐藏图片并弹出警告框。 <script for="pic" event="onerror">
//当 id 为 pic 的对象在装载过程中发生错误时触发此段代码
this.style.display="none" //隐藏图片
alert("所选文件并非图片,请重新选择")
</script> 5.完整代码。 <script for="upload" event="onpropertychange">
//当 id 为 upload 的对象上的属性发生变化时调用此段代码
//设置隐藏图片的地址为上传控件框的值
pic.src=this.value
</script>
<script for="pic" event="onload">
//当 id 为 pic 的对象在装载完成时触发此段代码
this.style.display="" //以行内元素方式显示隐藏的图片
</script>
<script for="pic" event="onerror">
//当 id 为 pic 的对象在装载过程中发生错误时触发此段代码
this.style.display="none" //隐藏图片
alert("所选文件并非图片,请重新选择")
</script>
<input type="file" id="upload">
<img id="pic" style="display:none"> 技巧:显示对象除了设置display为空,还可以设为 inline 和 block
public class Upload implements Action {
private File[] uploadFiles; public String execute() throws Exception {
//store uploadFiles ...
} public void setUploadFiles(File[] uploadFiles) {
this.uploadFiles = uploadFiles;
}
} 我们可以看到这个Action相当的简单, 只要定义一个File类型的属性以及setter, 我们就可以用这个File对象来作任何事情了. 页面和普通的upload页面没有区别: 代码
<form .... enctype="multipart/form-data">
....
File 1: <input type="file" name="uploadFiles">
File 2: <input type="file" name="uploadFiles">
<form> 需要注意栏位名称和Action的属性同名就可以了, 剩下的事情就是配置拦截器: xml 代码
<interceptors>
<interceptor name="upload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/> <interceptor-stack name="uploadStack">
<interceptor-ref name="upload"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors> <action name="doUpload" class="yourPackage.Upload">
<interceptor-ref name="uploadStack"/>
<result name="success">...</result>
</action> 除此之外, 这个拦截器还提供了额外的信息: ContentType和FileName供我们使用: [File Name]ContentType: 文件的ContentType(可以用在做download的时候)
[File Name]FileName: 实际的文件名 在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName这2个属性, 也能够被自动绑定. 具体的代码可以参考webwork的upload example 结论:灵活运用拦截器可以让原本复杂,繁琐的工作变得轻松,简单. 另补充几点: webwork的文件上传实际上是封装了几种通用的File Upload lib,并不是自己实现的,这它包括了pell,cos,apache common三种实现。 cos是oreilly的包,访问地址在http://servlets.com cos包的功能是最全面的,也是我最喜欢用的文件上传lib apache common 是apache的common中的一个 pell的来源我没有考证过。 webwork对这三个包的封装有些类似apache common logging,提供了一个通用的访问接口,至于具体用什么,则在webwork.properties中配置。 就我的经验来看,如果你直接使用Webwork的FileUpload拦截器,我一定推荐你使用pell,因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名,而cos会乱码,因此我们唯一的选择只有pell。 我不了解pell和apache common,但是webwork的封装丧失了很多cos的功能。cos需要设置request的character encoding,但是webwork的封装没有设置,所以就导致了cos的乱码问题,当然如果你单独使用cos,则会避免此类问题。 在webwork的file upload 拦截器功能中,它提供的File只是一个临时文件,Action执行之后就会被自动删除,因此你必须在Action中自己出来文件的存储问题,或者写到服务器的某个目录,或者保存到数据库中。如果你准备写到服务器的某个目录下面的话,你必须自己面临着处理文件同名的问题,但是实际上cos包已经提供了文件重名的自动重命名规则。 因此我的建议是不复杂的应用直接使用webwork的拦截器,复杂的应用自己写拦截器调用cos来完成。