Struts2控制文件下载
2008-12-05 13:58
337 查看
(一)简单控制下载
fileDown.html
<a href="download.action">下载压缩文件</a>
struts.xml
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="upload" extends="struts-default">
<action name="upload" class="jCuckoo.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<param name="maximumSize">20000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<!-- 保存路径savePath依赖注入 -->
<param name="savePath">/upload</param>
<result name="input"> /upload.jsp</result>
<result>/succ.jsp</result>
</action>
<action name="download" class="jCuckoo.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:
参数说明
contentType
内容类型,和MIME标准中的规定一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片
inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取属性inputStream需要提供getInputStream()方法
contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。
attachment;filename="XXX.XXX",表示文件下载的时候保存的名字应为XXX.XXX。如果直接写filename="XXX.XXX",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="XXX.XXX"
bufferSize
下载缓冲区的大小。
在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
FileDownloadAction.java
public class FileDownloadAction implements Action {
private String inputPath = //images//中.zip; //可以通过查找数据库获取
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
/** 提供转换编码后的供下载用的文件名 */
public String getDownloadFileName() throws UnsupportedEncodingException {
String downFileName = null;
int i = inputPath.lastIndexOf('//');
downFileName = inputPath.substring(i + 1);
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
return downFileName;
}
/*
* 下载用的Action应该返回一个InputStream实例, 该方法对应在result里的inputName属性值为targetFile
*/
public InputStream getTargetFile() throws Exception {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() throws Exception {
return SUCCESS;
}
}
(二)如果要实现下载授权控制
只需要将上面的execute()进行简单修改即可
public String execute() throws Exception
{
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
String user = (String)session.get("jCuckoo");
if ( user != null && user.equals("admin"))
{
return SUCCESS;
}
ctx.put("tip" , "您还没有登陆,或者登陆的用户名不正确,请重新登陆!");
return LOGIN;
}
对应的struts.xml修改成
<action name="download" class="jCuckoo.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
<result name="login">/input.jsp</result>
</action>
fileDown.html
<a href="download.action">下载压缩文件</a>
struts.xml
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="upload" extends="struts-default">
<action name="upload" class="jCuckoo.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<param name="maximumSize">20000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<!-- 保存路径savePath依赖注入 -->
<param name="savePath">/upload</param>
<result name="input"> /upload.jsp</result>
<result>/succ.jsp</result>
</action>
<action name="download" class="jCuckoo.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:
参数说明
contentType
内容类型,和MIME标准中的规定一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片
inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取属性inputStream需要提供getInputStream()方法
contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。
attachment;filename="XXX.XXX",表示文件下载的时候保存的名字应为XXX.XXX。如果直接写filename="XXX.XXX",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="XXX.XXX"
bufferSize
下载缓冲区的大小。
在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
FileDownloadAction.java
public class FileDownloadAction implements Action {
private String inputPath = //images//中.zip; //可以通过查找数据库获取
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
/** 提供转换编码后的供下载用的文件名 */
public String getDownloadFileName() throws UnsupportedEncodingException {
String downFileName = null;
int i = inputPath.lastIndexOf('//');
downFileName = inputPath.substring(i + 1);
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
return downFileName;
}
/*
* 下载用的Action应该返回一个InputStream实例, 该方法对应在result里的inputName属性值为targetFile
*/
public InputStream getTargetFile() throws Exception {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() throws Exception {
return SUCCESS;
}
}
(二)如果要实现下载授权控制
只需要将上面的execute()进行简单修改即可
public String execute() throws Exception
{
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
String user = (String)session.get("jCuckoo");
if ( user != null && user.equals("admin"))
{
return SUCCESS;
}
ctx.put("tip" , "您还没有登陆,或者登陆的用户名不正确,请重新登陆!");
return LOGIN;
}
对应的struts.xml修改成
<action name="download" class="jCuckoo.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
<result name="login">/input.jsp</result>
</action>
相关文章推荐
- 【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【控制文件上传和下载】
- struts2的文件下载(1):下载前的授权控制
- struts2学习之---控制文件下载
- Struts2文件下载(灵活控制MIME、FILENAME)
- 【Struts2】中文文件的下载与下载权限的控制
- 你能下载,他能下载吗?-----Struts2文件下载的权限控制(14)
- Struts2 控制文件上传下载
- Struts2 控制文件上传下载功能实例代码
- Struts2控制文件下载
- 4.4.3: Struts2文件下载---下载前的授权控制
- 使用struts2进行文件下载以及下载权限控制的例子
- struts2控制文件上传和下载
- 使用Struts2控制文件下载
- Struts2 控制文件上传下载
- Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)
- 使用struts2进行文件下载以及下载权限控制的例子
- struts2的单文件下载
- 使用Struts2实现文件的上传与动态下载(1)
- Struts2 Chapter 7&8 :文件的上传和下载,图形报表的生成part1
- Struts2 .apk 文件下载及解决中文文件名乱码问题(转)