当前位置: 首页 > 图文教程 > Java技术 > Java Web开发 > 浅谈Struts实现文件的下载
今天要和大家分享的是Struts中的文件下载,我主要说以下3种方法,原始超链接下载文件、Struts2提供的文件下载以及Struts2下载前的授权控制。
1,原始超链接下载文件
文件下载最简单的方法就是直接在页面上给出一个超链接,该链接的href属性等于要下载文件的文件名,就可以了。但如果该文件的文件名为中文,则会导致下载失败,或者应用程序需要在用户下载之前进行进一步的检查,比如判断用户是否有足够的权限来下载该文件等。
HTML页面的代码如下:
<body>
<h1>原始的下载</h1>
<ul>
<li> <!-- 包含中文文件名的下载链接 -->
要下载的文件:<a href="images/费用申请单.doc">费用申请单</a>
要下载的文件:<a href="images/application.doc">application</a>
</li>
</ul>
</body>
这里中文名的文件是下载不了的。
2,Struts2提供的文件下载
Struts2可以提供中文名文件下载的支持,HTML页面代码如下:
<body>
<h1>Struts2的文件下载</h1>
<ul>
<li>
下载中文名称的文件:<a href="download.action">下载中文名称文件</a>
</li>
</ul>
</body>
Action代码如下:
package com.annlee.upload;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
//该属性是依赖注入的属性,可以在配置文件中动态指定该属性值
private String inputPath;
//依赖注入该属性值的set方法
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public String execute() throws Exception{
return this.SUCCESS;
}
/**
* 下载用的action应该返回一个InputStream实例,该方法对应在result里的inputName属性值为targetFile
*/
public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext().getResourceAsStream(this.inputPath);
}
}
struts.xml文件中的配置如下:
<action name="download" class="com.annlee.upload.DownloadAction">
<!-- 指定被下载资源的位置 -->
<param name="inputPath">\images\struts-中.zip</param>
<!-- 配置结果类型为stream的结果 -->
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">application/zip</param>
<!-- 指定下载文件的文件位置 -->
<param name="inputName">targetFile</param>
<!-- 指定文件下载后的名称,中文还是显示不了 -->
<param name="contentDisposition">filename="struts-中.zip"</param>
<!-- 指定下载文件的缓冲区大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
从上面可以看到配置该action的关键是需要配置一个类型为stream的结果,配置时要指定以下四个属性:
contentType, inputName, contentDisposition, bufferSize因为stream结果类型的逻辑视图是返回给客户端一个输入流,因此不需要指定location属性。
3,Struts2下载前的授权控制
我们可以看到execute()方法是直接返回的,我们可以在这里加上授权控制的代码,如下:
public String execute() throws Exception{
//判断用户是否登录,如果session中的用户为空,就返回登录页面
if(null == ActionContext.getContext().getSession().get("user")){
//这里可以添加错误提示
ActionContext.getContext().put("downloadError", "你还没有登录,请登录后再下载!");
return "login";
}
return this.SUCCESS;
}
当然还在要struts.xml的action里加上login的返回视图。
<action name="download" class="com.annlee.upload.DownloadAction">
<!-- 指定被下载资源的位置 -->
<param name="inputPath">\images\struts-中.zip</param>
<!-- 配置结果类型为stream的结果 -->
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">application/zip</param>
<!-- 指定下载文件的文件位置 -->
<param name="inputName">targetFile</param>
<!-- 指定文件下载后的名称,中文还是显示不了 -->
<param name="contentDisposition">filename="struts-中.zip"</param>
<!-- 指定下载文件的缓冲区大小 -->
<param name="bufferSize">4096</param>
</result>
<result name="login">/login.jsp</result>
</action>
评论 (0) All