ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:109.63KB ,
资源ID:8299170      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8299170.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Struts2文件下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Struts2文件下载.docx

1、Struts2文件下载窗体底端Struts 2中实现文件下载(修正中文问题)博客分类:Struts2Struts浏览器IEFirefoxXML在BlogJava上已经有一位作者阐述了文件上传的问题,地址是在Struts 2中实现文件上传,因此我就不再讨论那个话题了。我今天简单介绍一下Struts 2的文件下载问题。我们的项目名为struts2hello,所使用的开发环境是MyEclipse 6,当然其实用哪个IDE都是一样的,只要把类库放进去就行了,文件下载不需要再加入任何额外的包。读者可以参考文档:http:/beansoft.java-cn.org/myeclipse_doc_cn/str

2、uts2_demo.pdf,来了解怎么下载和配置基本的Struts 2开发环境。为了便于大家对比,我把完整的struts.xml的配置信息列出来:Xml代码text/plaininputStreamattachment;filename=struts2中文.txt4096Struts中文附件.txttext/plaininputStreamattachment;filename=$downloadFileName4096/download/系统说明.doc系统说明.docapplication/octet-stream;charset=ISO8859-1inputStreamattachmen

3、t;filename=$downloadFileName4096Struts 2中对文件下载做了直接的支持,相比起自己辛辛苦苦的设置种种HTTP头来说,现在实现文件下载无疑要简便的多。说起文件下载,最直接的方式恐怕是直接写一个超链接,让地址等于被下载的文件,例如:下载file1.zip,之后用户在浏览器里面点击这个链接,就可以进行下载了。但是它有一些缺陷,例如如果地址是一个图片,那么浏览器会直接打开它,而不是显示保存文件的对话框。再比如如果文件名是中文的,它会显示一堆URL编码过的文件名例如%3457.。而假设你企图这样下载文件:http:/localhost:8080/struts2hell

4、o/download/系统说明.doc,Tomcat会告诉你一个文件找不到的404错误:HTTP Status 404 - /struts2hello/download/.doc。虽然目前还没发现直接配置Struts 2来正确的下载中文名字的附件,不过好在作者对JSP中的文件下载比较了解,因此我们另有办法解决这个问题。另外一个最大的用途,就是动态的生成并下载文件了,例如动态的下载生成的EXCEL,PDF,验证码图片等等。本节内容就依次讨论简单的下载文件代码,下载中文附件,最后介绍如何下载已经存在的文件。先说文件下载,编写一个普通的Action就可以了,只需要提供一个返回InputStream流

5、的方法,该输入流代表了被下载文件的入口,这个方法用来给被下载的数据提供输入流,意思是从这个流读出来,再写到浏览器那边供下载。这个方法需要由开发人员自己来编写,只需要返回值为InputStream即可。在我们的例子中方法的签名是:public InputStream getInputStream() throws Exception,当然它也可以是别的名字,例如getDownloadFile()。好了,现在我们所写的这个进行文件下载的Action类example.FileDownloadAction的源代码清单如下:Java代码packageexample;importjava.io.ByteA

6、rrayInputStream;importjava.io.InputStream;importcom.opensymphony.xwork2.Action;publicclassFileDownloadActionimplementsActionpublicInputStreamgetInputStream()throwsExceptionreturnnewByteArrayInputStream(Struts2下载示例.getBytes();publicStringexecute()throwsExceptionreturnSUCCESS;注意这里唯一特殊的方法就是getInputStre

7、am(),在这个方法里面我们使用了一个数组输入流来从字符串转换成的数组作为数据的来源进行读取。也许方法体中使用这样的实现代码:Java代码returnnewjava.io.FileInputStream(“c:test.txt”);/从系统磁盘文件读取数据这样会更直观一些。文件下载的第二步,乃是在struts.xml中对action进行配置,其代码清单如下所示:Xml代码text/plaininputStreamattachment;filename=struts2.txt4096这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指

8、定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:参数说明contentType内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片inputName下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStr

9、eam()方法contentDisposition文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:attachment;filename=struts2.txt,表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename=struts2.txt,那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename=struts2.txtbufferSize下载缓冲区的大小在这里面,contentType属性和contentDis

10、position分别对应着HTTP响应中的头Content-Type和Content-disposition头。好,我们先来看看这个例子,发布运行项目后键入测试地址:http:/localhost:8080/struts2hello/download.action,将会看到浏览器弹出一个文件保存对话框,如图12.12所示。图12.12 文件下载对话框(IE 7和Firefox 3)如果此时使用某些工具来探测浏览器返回的HTTP头,将会看到下列内容:HTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-disposition: attachment;fi

11、lename=struts2.txtContent-Type: text/plainTransfer-Encoding: chunkedDate: Sun, 02 Mar 2008 02:58:25 GMT。所以用来下载的action配置中,只有两个是和浏览器有关的:contentType和contentDisposition。关于contentType的取值,如果是未知的文件类型,或者说出现了浏览器不能打开的文件,例如.bean文件,或者说这个action是用来做动态文件下载的,事先并不知道未来的文件类型是什么,那么我们可以把它的值设置成为:application/octet-stream;

12、charset=ISO8859-1,注意一定要加入charset,否则某些时候会导致下载的文件出错;有人说这时也可以设置成为application/x-download,根据笔者的实践,这个头也能正常工作,然而个别时候会出现浏览器无法识别的问题。而contentDisposition,如果其取值是filename=struts2.txt,或者是inline; filename=struts2.txt,运行后你可以看到浏览器直接显示了文件的内容:Struts 2下载示例,而不再弹出对话框提示用户保存文件到硬盘上。所以读者如果想确保文件是被下载而不是被打开,务必使用格式attachment;fil

13、ename=struts2.txt,不要丢了attachment;这个类型信息。至此,关于文件下载的技术内容,已经告一段落。然而做中文系统,不可避免的要解决中文附件的下载问题。关于这个内容,也无权威的资料可查,我们只能用实践中得到的解决方案来处理。也许有读者以为将filename属性设置为filename=”struts2中文.txt”就能解决问题了,好,就来试试,把contentDisposition修改成:attachment;filename=struts2中文.txt。再次键入地址进行测试,看看显示的结果,如图12.13所示。唉,真是完全不给面子!IE压根就不能显示出来文件名,草草敷衍

14、了download_action了事。Firefox稍好点,还出来了一个对话框,但是很显然,那个显示的struts2-txt绝对不是我们日思夜想的struts2中文.txt。怎么办?解决方法是有,那就是用ISO8859-1编码来显示这个中文字符,可以阅读12.8参考资料一节中的JSP文件下载的相对完整代码(解决中文问题和Weblogic报错)这篇文章,可以这样认为,所有的文件下载代码都是基于同样的纯Servlet的方式来进行的。如果是Java代码,我们可以这样做:图12.13 IE和Firefox下的中文文件下载对话框String downFileName = new String(“stru

15、ts2中文.txt”.getBytes(), ISO8859-1);然后把生成的结果字符串放到XML文件中就行了,然而它的输出类似于struts2?.txt,是无法直接写道我们的XML配置文件中的。所以,我们想到的的办法,就是在Action类中写一个方法来做转码,使它成为某个属性,所以要以get开头。然后,再用12.3.8给Action注入参数(param)值一节的内容,将文件名以正常的方式设置为action类的某个属性,最后呢,再利用一个小小的param参数取值中的伎俩:$属性名,它可以直接从action类中动态获取某个属性值。好了,现在让我们来看看第二个文件下载类FileDownloadA

16、ction2的代码:Java代码packageexample;importjava.io.ByteArrayInputStream;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;importcom.opensymphony.xwork2.Action;publicclassFileDownloadAction2implementsActionprivateStringfileName;/初始的通过param指定的文件名属性publicInputStreamgetInputStream()throwsEx

17、ceptionreturnnewByteArrayInputStream(Struts2下载示例.getBytes();publicStringexecute()throwsExceptionreturnSUCCESS;publicvoidsetFileName(StringfileName)this.fileName=fileName;/*提供转换编码后的供下载用的文件名*/publicStringgetDownloadFileName()StringdownFileName=fileName;trydownFileName=newString(downFileName.getBytes()

18、,ISO8859-1);catch(UnsupportedEncodingExceptione)e.printStackTrace();returndownFileName;这个类有两个属性,第一个是fileName,它是需要被指定的下载文件名;第二个则是动态的仅仅由getDownloadFileName()这个方法定义的属性downloadFileName,它的值随着fileName而动态变动,仅仅是把它转换成了ISO8859方式的西欧字符集。接下来就是如何配置这个action了,这是关键的地方所在,现在配置一个新的action,名为download2,其源代码如下:Xml代码Struts中

19、文附件.txttext/plaininputStreamattachment;filename=$downloadFileName4096其中特殊的代码就是$downloadFileName,它的效果相当于运行的时候将action对象的属性的取值动态的填充在$中间的部分,我们可以认为它等价于action.getDownloadFileName()。好了,现在让我们重新发布然后运行这个项目,键入地址:http:/localhost:8080/struts2hello/download2.action进行访问,可以看到运行结果完全正确,如图12.14所示。图 12.14 正确显示了文件下载名的对话框(IE和Firefox)在本节的最后部分,我们来讨论一下如何下载已经存在于当前Web应用目录下的已经存在的文件。一般的网站可能会把要下载的文件放在某个固定的目录下,例如WebRoot/download,在这个子目录下,我们放了一个名为系统说明.doc的文件,希望最后我们的action能够正确的下载这个文件。要检验下载是否成功非常简单,文件内容仅仅是粗体的系统说明书这五个字,而word文件坏一个字节的话都是打不开的,所以下载后再用word打开即可检验是否成功。现在我们创建第三个文件下载的Action类,名为example. FileDownloadAction3,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1