在BlogJava上已经有一位作者阐述了文件上传的问题, 地址是在Struts 2中实现文件上传 , 因此我就不再讨论那个话题了。我今天简单介绍一下Struts 2的文件下载问题。
我们的项目名为 struts2hello ,所使用的开发环境是MyEclipse 6,当然其实用哪个 IDE 都 是一样的,只要把类库放进去就行了,文件下载不需要再加入任何额外的包。读者可以参考 文档:beansoft.javacn.org/myeclipse_doc_cn/struts2_demo.pdf ,来了解怎么下载 和配置基本的 Struts 2开发环境。
为了便于大家对比,我把完整的 l 的配置信息列出来:
Xml代码
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "/dtds/struts-2.0.dtd">
5
6 <struts>
7 <package name="default" extends="struts-default" >
8 <!-- 在这里添加 Action 定义 -->
9
10 <!-- 简单文件下载 -->
11 <action name="download" class="example.FileDownloadAction">
12 <result name="success" type="stream">
13 <param name="contentType">text/plain</param>
14 <param name="inputName">inputStream</param>
15 <param
name="contentDisposition">attachment;filename="struts2中文.txt"</param>
16 <param name="bufferSize">4096</param>
17 </result>
18 </action>
19
20 <!-- 文件下载,支持中文附件名 -->
21 <action name="download2" class="example.FileDownloadAction2">
22 <!-- 初始文件名 -->
23 <param name="fileName">Struts 中文附件.txt</param>
24 <result name="success" type="stream">
25 <param name="contentType">text/plain</param>
26 <param name="inputName">inputStream</param>
27 <!-- 使用经过转码的文件名作为下载文件名, downloadFileName
属性
28 对应 action类中的方法 getDownloadFileName() -->
29 <param
name="contentDisposition">attachment;filename="${downloadFileName}"</param>
30 <param name="bufferSize">4096</param>
31 </result>
32 </action>
33
34 <!-- 下载现有文件 -->
35 <action name="download3" class="example.FileDownloadAction3">
36 <param name="inputPath">/download/系统说明.doc</param>
37 <!-- 初始文件名 -->
38 <param name="fileName">系统说明.doc</param>
39 <result name="success" type="stream">
40 <param
name="contentType">application/octet-stream;charset=ISO8859-1</param>
41 <param name="inputName">inputStream</param>
42 <!-- 使用经过转码的文件名作为下载文件名, downloadFileName
属性
43 对应 action类中的方法 getDownloadFileName() -->
进程和线程的区别操作系统
44 <param
name="contentDisposition">attachment;filename="${downloadFileName}"</param>
45 <param name="bufferSize">4096</param>
46 </result>
47 </action>
48
49 </package>
50
sql语句格式规范51 </struts>
Xml代码
52 <?xml version="1.0" encoding="UTF-8" ?>
53 <!DOCTYPE struts PUBLIC
54 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
55 "/dtds/struts-2.0.dtd">
56
57 <struts>
58 <package name="default" extends="struts-default" >
59 <!-- 在这里添加 Action 定义 -->
60
61 <!-- 简单文件下载 -->
62 <action name="download" class="example.FileDownloadAction">
63 <result name="success" type="stream">
64 <param name="<SPAN class=hilite3><SPAN
>contentType</SPAN></SPAN>">text/plain</param>
65 <param name="inputName">inputStream</param>
66 <param
name="contentDisposition">attachment;filename="<SPAN class=hilite1><SPAN
>struts2</SPAN></SPAN>中文.txt"</param>
67 <param name="bufferSize">4096</param>
68 </result>
69 </action>
70
71 <!-- 文件下载,支持中文附件名 -->
72 <action name="download2" class="example.FileDownloadAction2">
73 <!-- 初始文件名 -->
74 <param name="fileName">Struts 中文附件.txt</param>
75 <result name="success" type="stream">
76 <param name="<SPAN class=hilite3><SPAN
>contentType</SPAN></SPAN>">text/plain</param>
77 <param name="inputName">inputStream</param>
78 <!-- 使用经过转码的文件名作为下载文件名, downloadFileName 属性
79 对应 action类中的方法 getDownloadFileName() -->
80 <param
name="contentDisposition">attachment;filename="${downloadFileName}"</param>
81 <param name="bufferSize">4096</param>
82 </result>
83 </action>
84
85 <!-- 下载现有文件 -->
86 <action name="download3" class="example.FileDownloadAction3">
87 <param name="inputPath">/download/系统说明.<SPAN
class=hilite5>doc</SPAN></param>
88 <!-- 初始文件名 -->
89 <param name="fileName">系统说明.<SPAN
class=hilite5>doc</SPAN></param>
90 <result name="success" type="stream">
91 <param name="<SPAN class=hilite3><SPAN
>contentType</SPAN></SPAN>">application/octet-stream;charset=ISO885 9-1</param>
92 <param name="inputName">inputStream</param>
93 <!-- 使用经过转码的文件名作为下载文件名, downloadFileName 属性
94 对应 action类中的方法 getDownloadFileName() -->
95 <param
name="contentDisposition">attachment;filename="${downloadFileName}"</param>
96 <param name="bufferSize">4096</param>
97 </result>
98 </action>
99
100 </package>
101
102</struts>
Struts 2中对文件下载做了直接的支持,相比起自己辛辛苦苦的设置种种HTTP 头来说,现 在实现文件下载无疑要简便的多。说起文件下载,最直接的方式恐怕是直接写一个超链接, 让地址等于被下载的文件,例如:<a href=”file1.zip”> 下载 file1.zip</a> ,之后用户在浏 览器里面点击这个链接, 就可以
进行下载了。 但是它有一些缺陷, 例如如果地址是一个图片, 那么浏览器会直接打开它,而不是显示保存文件的对话框。再比如如果文件名是中文的,它 会显示一堆URL 编码过的文件名例如%。而假设你企图这样下载文件:
localhost:8080/struts2hello/download/系统说明.doc , T omcat 会告诉你一个文件不 到的404错误:HTTP Status 404 /struts2hello/download/ϵͳ˵Ã÷.doc 。虽然目前还没发 现直接配置 Struts 2来正确的下载中文名字的附件, 不过好在作者对 JSP 中的文件下载比较 了解,因此我们另有办法解决这个问题。另外一个最大的用途,就是动态的生成并下载文件 了,例如动态的下载生成的 EXCEL,PDF,验证码图片等等。本节内容就依次讨论简单的 下载文件代码,下载中文附件,最后介绍如何下载已经存在的文件。
先说文件下载,编写一个普通的 Action 就可以了,只需要提供一个返回 InputStream 流的 方法,该输入流代表了被下载文件的入口,这个方法用来给被下载的数据提供输入流,意思 是从这个流读出来,再写到浏览器那边供下载。这个方法需要由开发人员自己来编写,只需 要返回值为 InputStream 即可。在我们的例子中方法的签名是:public InputStream getInputStream() throws Exception , 当然它也可以是别的名字, 例如 getDownloadFile() 。 好了, 现在我们所写的这个进行文件下载的 Action 类example.FileDownloadAction 的源 代码清单如下:
Java代码
103package example;
104
105import java.io.ByteArrayInputStream;
106
107import java.io.InputStream;
108
109import com.opensymphony.xwork2.Action;
110
111public class FileDownloadAction implements Action {
112
113 public InputStream getInputStream() throws Exception {
114
115 return new ByteArrayInputStream("Struts 2 下载示例".getBytes());
116
117 }
118
119 public String execute() throws Exception {
120
121 return SUCCESS;
122
123 }
124
125}
Java代码
126package example;
127
128import java.io.ByteArrayInputStream;
129java下载过程
130import java.io.InputStream;
131
132import com.opensymphony.xwork2.Action;
php mysql 下载133
134public class FileDownloadAction implements Action {
135
136 public InputStream getInputStream() throws Exception {
137
138 return new ByteArrayInputStream("Struts 2 下载示例".getBytes());
139
140 }
141
142 public String execute() throws Exception {
143
144 return SUCCESS;
145
146 }
147
148}
注意这里唯一特殊的方法就是 getInputStream() ,在这个方法里面我们使用了一个数组输 入流来从字符串转换成的数组作为数据的来源进行读取。也许方法体中使用这样的实现代 码:
Java代码
149return new java.io.FileInputStream(“c:\\”);//从系统磁盘文件读取数 据
Java代码
150return new java.io.FileInputStream(“c:\\”);//从系统磁盘文件读取数 据
这样会更直观一些。
文件下载的第二步,乃是在 l 中对 action 进行配置,其代码清单如下所示:
Xml代码
151<!-- 简单文件下载 -->
152
153<action name="download" class="example.FileDownloadAction">
154
155 <result name="success" type="stream">
156
157 <param name="contentType">text/plain</param>
158
159 <param name="inputName">inputStream</param>
160
161 <param
name="contentDisposition">attachment;filename=""</param>
162
163 <param name="bufferSize">4096</param>
164
165 </result>
166
167</action>
Xml代码
168<!-- 简单文件下载 -->
169
170<action name="download" class="example.FileDownloadAction">
171
172 <result name="success" type="stream">
173
174 <param name="<SPAN class=hilite3><SPAN >contentType</SPAN></SPAN>">text/plain</param>
175
176 <param name="inputName">inputStream</param>
177
178 <param name="contentDisposition">attachment;filename="<SPAN
class=hilite1><SPAN >struts2</SPAN></SPAN>.txt"</param>
179十字式万向联轴器
180 <param name="bufferSize">4096</param>
181
网页模版设计182 </result>
183
184</action>
这个 action 特殊的地方在于 result 的类型是一个流(stream ),配置 stream 类型的结果 时,因为无需指定实际的显示的物理资源,所以无需指定 location 属性,只需要指定
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论