以下是通过学习轻量级javaee企业实战一书总结:
struts2提供stream结果类型,该类型专门用于支持文件下载功能。指定stream结果类型时,需要指定一个inputStream参数,该参数自定了一个输入流,这个输入流是被下载文件的入口
1.实现文件下载的Action
如果应用程序需要用户下载之前进行进一步检查,比如判断用户是否有足够权限来下载该文件等,就需要让struts2来控制下载了。
Action需要提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口
public class FileDownloadAcion extends ActionSupport{
private String inputPath;//该成员变量可以在配置文件中动态指定该值
set,get()方法
//返回指定文件对应的输入流
public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
}
2.配置Action
关键是需要配置一个类型为stream的结果,该stream类型的结果将使用文件下载作为响应
配置stream类型的结果需要指定如下4个参数:
1. contentType:指定被下载文件的文件类型
2. inputStream:指定被下载文件的入口输入流
3. contentDispoistion:指定下载的文件名
4. bufferSize:指定下载文件时的缓冲大小
stream结果类型的逻辑视图是返回给客户端一个输入流,因此无需指定location属性
<action name="download" class="">
<param name="inputPath">文件地址</param>
<result type="stream">
<param name="contentType"></param>
//inputName参数的值就是方法去掉get前缀、首字母小写的字符串
<param name="inputName">targetFile</param>
<param name="contentDisposition">fileName=""</param>
<param name="bufferSize">4096</param>
</result>
</action>
3.下载前的授权控制
下面的Action的execute方法在返回success字符串之前,首先通过判断session里的user属性是否为haha,如果用户通过验证就允许下载,否则之间返回登录页面。
public class AuthorityAction implements Action{
private String inputPath;
set,get()方法
public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() throws Exception{
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
String user = (String)session.get("user");
if(user ! = null && user.equals("haha")){
return SUCCESS;
}
ctx.put("tip","登录的用户名不正确,请重新登录");
return LOGIN;
}
}
struts.xml配置文件的配置
<action name="authoritydown" class="">
<result type="stream">
<param name="contentType"> </param>
<param name="inputStream">targetfile</param>
<param name="contentDiposition">filename=""</param>
<param name="bufferSize">4096</param>
</result>
<result name="login">/WEB-INF/content/</result>
</action>