struts2下载文件
项目用到下载文件,以下是我写的下载文件的源代码,支持文件名称为中文
ACTION:
配置文件:
[code="java]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 设置默认编码格式 -->
<constant name="struts.i18n.encoding" value="GBK" />
<!-- 设置最大上传文件是300M -->
<constant name="struts.multipart.maxSize" value="314572800" />
<!-- 设置默认的临时文件存储位置 -->
<constant name="struts.multipart.saveDir" value="C:/fileUpload" />
<!-- 设置调试模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="fileupload" extends="struts-default" namespace="/file">
<!-- 文件上传 -->
<action name="upload" class="com.file.action.FileUploadAction">
<result type="redirectAction">
<param name="actionName">list</param>
<param name="namespace">/file</param>
</result>
</action>
<!-- 下载文件 -->
<action name="download" class="com.file.action.FileDownloadAction">
<result type="stream" name="success">
<param name="contentType">application/octet-stream</param>
<!-- 要有相对应的getDownloadFile()方法返回值是 InputStream -->
<param name="inputName">downloadFile</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
<!-- 文件下载列表 -->
<action name="list" class="com.file.action.FileListAction">
<result>/file.jsp</result>
</action>
</package>
</struts>
[/code]
contentType有多个属性,比如text/plain是文本类型,具体大家可以查看相关文档,application/octet-stream;charset=ISO8859-1是所有的文件的类型,以流的方式读取。
ontentDisposition表示下载文件的处理方式,有inline(默认)和attachment两种。若指定为inline模式,浏览器会先尝试直接打开文件,无法直接打开则弹出保存对话框;attachment模式则直接弹出文件保存对话框。
inputName表示下载文件的来源流。若inputName取值为downloadFile,则在相应的action类中必须有一个返回类型为InputStream的getDownloadFile方法来返回下载的文件入口。
filename="${filenameInCN}",filename是下载文件的名称,可以随便制定。
读取项目中的源文件返回InputStream类型
ServletActionContext.getServletContext().getResourceAsStream("/upload/123.txt");
获取项目的根目录
String path = ServletActionContext.getServletContext().getRealPath("/");
另外参考[url]http://aimilin6688.iteye.com/blog/1062730[/url]
项目用到下载文件,以下是我写的下载文件的源代码,支持文件名称为中文
ACTION:
package com.file.action;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownloadAction extends ActionSupport {
private String fileName;// 要下载的文件名
public String execute() throws Exception {
return SUCCESS;
}
// 下载文件
public InputStream getDownloadFile() {
InputStream is = null;
try {
is = new FileInputStream("c:/download/" + fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return is;
}
public void setFileName(String fileName) {
try {// 解决中文文件名问题
this.fileName = new String(fileName.getBytes("ISO-8859-1"), "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public String getFileName() {
String name = "";
try {// 解决下载文件中文文件名问题
name = new String(fileName.getBytes("GBK"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return name;
}
}
配置文件:
[code="java]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 设置默认编码格式 -->
<constant name="struts.i18n.encoding" value="GBK" />
<!-- 设置最大上传文件是300M -->
<constant name="struts.multipart.maxSize" value="314572800" />
<!-- 设置默认的临时文件存储位置 -->
<constant name="struts.multipart.saveDir" value="C:/fileUpload" />
<!-- 设置调试模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="fileupload" extends="struts-default" namespace="/file">
<!-- 文件上传 -->
<action name="upload" class="com.file.action.FileUploadAction">
<result type="redirectAction">
<param name="actionName">list</param>
<param name="namespace">/file</param>
</result>
</action>
<!-- 下载文件 -->
<action name="download" class="com.file.action.FileDownloadAction">
<result type="stream" name="success">
<param name="contentType">application/octet-stream</param>
<!-- 要有相对应的getDownloadFile()方法返回值是 InputStream -->
<param name="inputName">downloadFile</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
<!-- 文件下载列表 -->
<action name="list" class="com.file.action.FileListAction">
<result>/file.jsp</result>
</action>
</package>
</struts>
[/code]
contentType有多个属性,比如text/plain是文本类型,具体大家可以查看相关文档,application/octet-stream;charset=ISO8859-1是所有的文件的类型,以流的方式读取。
ontentDisposition表示下载文件的处理方式,有inline(默认)和attachment两种。若指定为inline模式,浏览器会先尝试直接打开文件,无法直接打开则弹出保存对话框;attachment模式则直接弹出文件保存对话框。
inputName表示下载文件的来源流。若inputName取值为downloadFile,则在相应的action类中必须有一个返回类型为InputStream的getDownloadFile方法来返回下载的文件入口。
filename="${filenameInCN}",filename是下载文件的名称,可以随便制定。
读取项目中的源文件返回InputStream类型
ServletActionContext.getServletContext().getResourceAsStream("/upload/123.txt");
获取项目的根目录
String path = ServletActionContext.getServletContext().getRealPath("/");
另外参考[url]http://aimilin6688.iteye.com/blog/1062730[/url]