文件下载:
可能有人疑问:直接把文件放在Web应用的根路径下,即可实现文件下载。
但实际上可能存在如下问题:
1.当文件名有中文字符时,就无法下载了。
2.直接放在Web应用的根路径下,将导致所有人可以自由下载该资源,毫无安全性可言。
为了解决上面两个问题,此时就需在通过struts 2的文件下载进行控制了。
实现文件下载的Action,关键只有一条:
要提供一个返回值为InputStream的getter方法。
----该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流。
借助于struts 2的文件上载之后,
----所有的文件下载都要经过Struts 2的Action处理。
downPage.jsp
error.jsp
可能有人疑问:直接把文件放在Web应用的根路径下,即可实现文件下载。
但实际上可能存在如下问题:
1.当文件名有中文字符时,就无法下载了。
2.直接放在Web应用的根路径下,将导致所有人可以自由下载该资源,毫无安全性可言。
为了解决上面两个问题,此时就需在通过struts 2的文件下载进行控制了。
实现文件下载的Action,关键只有一条:
要提供一个返回值为InputStream的getter方法。
----该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流。
借助于struts 2的文件上载之后,
----所有的文件下载都要经过Struts 2的Action处理。
因此Action就可以对是否允许用户下载进行控制。
struts.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="default" extends="struts-default">
<action name="down" class="pers.zkr.action.DownAction">
<result name="login">/WEB-INF/content/login.jsp</result>
<result type="stream">
<!--该参数指定二进制流的类型 -->
<param name="contentType">${resType}</param>
<!--指定返回InputStream的方法 -->
<param name="inputName">target</param>
<!-- 指定文件 下载后,在客户端显示的文件 的名字 -->
<param name="contentDisposition">filename=${resName}</param>
<!-- 指定文件下载的缓冲的大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
<action name="loginPro" class="pers.zkr.action.LoginProAction">
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/downPage.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
两个action类
<span style="font-size:10px;">package pers.zkr.action;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
//此处是一个通用的文件 下载Action,如下内容是可变的
//1.下载的目标资源(名字) 2.下载的文件类型。 3.下载的文件名(另起的名字)
public class DownAction extends ActionSupport {
private String res; //下载的资源,服务器里面文件的名字
private String resType; //下载的文件类型
private String resName; //下载的文件名,下载文件时,给文件起的名字
public String getRes() {
return res;
}
public void setRes(String res) throws IOException {
this.res = new String(res.getBytes("iso-8859-1"),"utf-8");
}
public String getResType() {
return resType;
}
public void setResType(String resType) {
this.resType = resType;
}
public String getResName() {
return resName;
}
public void setResName(String resName) {
this.resName = resName;
}
//该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流
public InputStream getTarget() throws IOException{
//返回res资源所对应的输入流。
return new FileInputStream(ServletActionContext.
getServletContext().getRealPath("/")+res);
}
//对下载的权限进行控制
public String execute(){
Integer userId=(Integer) ActionContext.getContext()
.getSession().get("userId");
if(userId==null||userId<0){
return LOGIN;
}
return SUCCESS;
}
}</span><span style="font-size:24px;">
</span>
package pers.zkr.action;
import java.util.Random;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginProAction extends ActionSupport {
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String execute(){
if(name.equals("zhangsan")&&
pass.equals("123456")){
ActionContext.getContext()
.getSession().put("userId", new Random().nextInt(999999));
addActionMessage("登录成功!");
return SUCCESS;
}
addActionError("新重新登录!");
return ERROR;
}
}
downPage.jsp
<body>
<s:actionmessage/>
<!--pptx类型的文件的文件类型可以在 F:\tomcat6.0\conf\web.xml 文件中找到 -->
<a href="${pageContext.request.contextPath}/down?res=232.pptx&resType=application/vnd.openxmlformats-officedocument.presentationml.presentation&resName=struts.pptx">下载struts</a>
</body>
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<h3>请先登录系统,然后下载</h3>
<s:form action="loginPro">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="pass" label="密码"></s:password>
<s:submit value="登录"></s:submit>
</s:form>
</body>
error.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:actionerror/>
</body>