因为下载文件就是一个按钮或者一个链接,所以以下就不列出页面代码,只列出struts.xml配置和Action类
1.一个简单的文件下载
struts.xml:
Action类:
2.文件下载,支持中文附件名
struts.xml:
Action类:
3.下载真是文件
struts.xml
Action类:
1.一个简单的文件下载
struts.xml:
<action name="downloadAction" class="com.edifier.action.FileDownloadAction">
<result name="success" type="stream">
<!--内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,
image/gif代表GIF图片,image/jpeg代表JPG图片-->
<param name="contentType">text/plain</param>
<!-- 下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,
例如取值为inputStream 的属性需要编写getInputStream()方法 -->
<param name="inputName">inputStream</param>
<!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则
浏览器会尝试直接显示文件 attachment;filename="struts2.txt" ,表示文件下载的时候保存的名字应为struts2.txt。
如果直接写filename="struts2.txt" ,那么默认情况是代表inline ,浏览器会尝试自动打开它。-->
<param name="contentDisposition">attachment;filename="struts2.txt"</param>
<!-- 下载缓冲区的大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
Action类:
package com.edifier.action;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action {
public InputStream getInputStream() throws Exception {
//"Struts 2 下载示例"就是下载的文件的内容。
return new ByteArrayInputStream("Struts 2 下载示例".getBytes());
}
public String execute() throws Exception {
return SUCCESS;
}
}
2.文件下载,支持中文附件名
struts.xml:
<action name="downloadAction2" class="com.edifier.action.FileDownloadAction2">
<!-- 初始文件名,这个名字会传到Action中,之后被转码再下载 -->
<param name="fileName">Struts中文附件.txt</param>
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">inputStream</param>
<!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性
对应action类中的方法 getDownloadFileName() -->
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
Action类:
package com.edifier.action;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction2 implements Action {
private String fileName;// 依赖注入获取
public void setFileName(String fileName) {
this.fileName = fileName;
}
/** 提供转换编码后的供下载用的文件名 */
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}
public InputStream getInputStream() throws Exception {
//这里可以提供一个文件输入流就可以下载文件了。
return new ByteArrayInputStream("Struts 2 下载示例".getBytes());
}
public String execute() throws Exception {
return SUCCESS;
}
}
3.下载真是文件
struts.xml
<action name="downloadAction3" class="com.edifier.action.FileDownloadAction3">
<!-- 供下载的文件相对路径 -->
<param name="inputPath">/download/Java面试宝典2012版130.doc</param>
<!-- 初始文件名 -->
<param name="fileName">Java面试宝典2012版130.doc</param>
<result name="success" type="stream">
<!-- contentType 的取值,如果是未知的文件类型,或者说出现了浏览器不能打开的文件,例如.bean 文件,或者说
这个action是用来做动态文件下载的,事先并不知道未来的文件类型是什么,那么我们可以把它的值设置成为:
application/octet-stream;charset=ISO8859-1 ,注意一定要加入charset ,否则某些时候会导致下载的文件出错。
-->
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性
对应action类中的方法 getDownloadFileName() -->
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
Action类:
package com.edifier.action;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction3 implements Action {
private String fileName;// 依赖注入获取
private String inputPath;// 依赖注入获取,下载的文件相对路径
public void setInputPath(String value) {
inputPath = value;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
/** 提供转换编码后的供下载用的文件名 */
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}
public InputStream getInputStream() throws Exception {
// 通过 ServletContext,也就是application 来读取数据
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() throws Exception {
return SUCCESS;
}
}