1. Action类
public class FileDownloadAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String fileName1;
public String getFileName1() {
System.out.println("---"+fileName1);
try {
fileName1 = new String(fileName1.getBytes(), "iso-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return fileName1;
}
public void setFileName1(String fileName1) {
this.fileName1 = fileName1;
}
public InputStream getInputStream() throws Exception{
String fileName = "测试图片.jpg";
this.fileName1 = "测试图片.jpg";
return new FileInputStream("E:/"+fileName);
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
getFileName1方法中对fileName1进行了编码转换,转为iso-8859-1,否则下载的文件名会出错.
getInputStream方法为struts2默认调用的方法,可通过参数inpuName进行修改.
2. struts.xml配置 <package name="manager1" extends="struts-default">
<action name="download" class="com.skymr.struts2.chapter5.action.FileDownloadAction">
<result type="stream">
<param name="contentDisposition">attachment;fileName=${fileName1}</param>
</result>
</action>
</package>
result参数配置
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">1024</param>
结果类型必须要写成 type="stream" ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult
1) <param name="contentDisposition">attachment;fileName="${fileName}"</param>
contentDisposition默认是 inline(内联的), 比如说下载的文件是文本类型的,就直接在网页上打开,不能直接打开的才会打开下载框自己选择
2) attachment :下载时会打开下载框
3) fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字
4.<param name="inputName">downloadFile</param>,这个downloadFile名字要和Action类中的getDownloadFile()方法名去掉get 一致
3.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>My JSP 'HelloWorld.jsp' starting page</title>
</head>
<body><br>
<a href="download">文件下载</a>
</body>
</html>