使用Struts2拦截器实现文件下载:
public class User implements java.io.Serializable{
//保存上传的文件
private File upload;
//文件的类型
private String uploadContentType
//文件的名字
private String uploadFileName;
//是否上传简历文件的标识
private String isUpload;
//下载文件
private InputStream inputStream;
private String userID;//用户名
private String userName;//用户姓名
private String loginName;//登录名
private String loginPwd;//登录密码
private String sex;//性别
}
-----------------------
struts-default.xml
<result-type name="stream" class="org.apache.struts2.dispacher.VelocityResult"/>
struts.xml
<!--实现文件下载-->
<result name="download" type="stream">
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${#request.filename}"</param>//注意$的用法
</result>
注意:取到的filename可能有乱码问题 因为.java默认的是gbk,而xml默认的编码方式是iso8859-1
fielName = new String(fileName.getBytes("gbk"),"iso8859-1");
----------------------
User.java
//文件下载使用的流对象 inputStream;
pirvate InputStream inputStream; getter/setter
----------------------
view.jsp
<tr>
<td align="center" bgColor="#f5fafe" class="ta_01">
简历资料:
</td>
<td class="ta_01" bgColor="#ffffff" colSpan="3">
<a href="#" οnclick="openWindow('user/userAction_download.do?userID=${userID }','700','400')" class="cl_01">
<s:property value="filename"/>
</a>
</td>
</tr>
UserAction
public String download() throws Exception{
//使用userID 获取当前用户ID所拥有的详细信息
UserService service = new UserService();
/**
*前边的user是service方法返回的user,在daoImpl中创建出来的,所以不
*是模型驱动中的user
*/
user = service.findUserByID(user);//括号里边的user是模型驱动对象
//在当前用户信息中得到当前用户上传附件的路径
String path = user.getPath();
InputStream inputStream = new FileInputStream(path);//相当于把我路径当中的文件加载到流里边了
user.setInputStream(inputStream);//把这个流给用户,可是这个user不是模型驱动中的对象
//获取当前文件的文件名
String fileName = user.getFilename();
ServletActionContext.getRequest().setAttribute("filename",fileName); //这个filename在struts.xml用到了
//将user对象放置到栈顶
//获取栈顶对象
ValueStack valueStack = ServletActionContext.getContext().getValueStack;
//清空栈顶对象
valueStack.pop();
//将user放置到栈顶
valueStack.push(user);
return "download";
}
public class User implements java.io.Serializable{
//保存上传的文件
private File upload;
//文件的类型
private String uploadContentType
//文件的名字
private String uploadFileName;
//是否上传简历文件的标识
private String isUpload;
//下载文件
private InputStream inputStream;
private String userID;//用户名
private String userName;//用户姓名
private String loginName;//登录名
private String loginPwd;//登录密码
private String sex;//性别
}
-----------------------
struts-default.xml
<result-type name="stream" class="org.apache.struts2.dispacher.VelocityResult"/>
struts.xml
<!--实现文件下载-->
<result name="download" type="stream">
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${#request.filename}"</param>//注意$的用法
</result>
注意:取到的filename可能有乱码问题 因为.java默认的是gbk,而xml默认的编码方式是iso8859-1
fielName = new String(fileName.getBytes("gbk"),"iso8859-1");
----------------------
User.java
//文件下载使用的流对象 inputStream;
pirvate InputStream inputStream; getter/setter
----------------------
view.jsp
<tr>
<td align="center" bgColor="#f5fafe" class="ta_01">
简历资料:
</td>
<td class="ta_01" bgColor="#ffffff" colSpan="3">
<a href="#" οnclick="openWindow('user/userAction_download.do?userID=${userID }','700','400')" class="cl_01">
<s:property value="filename"/>
</a>
</td>
</tr>
UserAction
public String download() throws Exception{
//使用userID 获取当前用户ID所拥有的详细信息
UserService service = new UserService();
/**
*前边的user是service方法返回的user,在daoImpl中创建出来的,所以不
*是模型驱动中的user
*/
user = service.findUserByID(user);//括号里边的user是模型驱动对象
//在当前用户信息中得到当前用户上传附件的路径
String path = user.getPath();
InputStream inputStream = new FileInputStream(path);//相当于把我路径当中的文件加载到流里边了
user.setInputStream(inputStream);//把这个流给用户,可是这个user不是模型驱动中的对象
//获取当前文件的文件名
String fileName = user.getFilename();
ServletActionContext.getRequest().setAttribute("filename",fileName); //这个filename在struts.xml用到了
//将user对象放置到栈顶
//获取栈顶对象
ValueStack valueStack = ServletActionContext.getContext().getValueStack;
//清空栈顶对象
valueStack.pop();
//将user放置到栈顶
valueStack.push(user);
return "download";
}