刚开始以为下载代码很好写,就是给文件的具体路径,就可直接下载了,可后来发现,只有路径的话,很多浏览器会把要下载的文件给打开,在页面输出为乱码,所以记录一下这个的经验,以备不时之需:
1.确保当前项目下有 struts2-caore.jar,xwork.jar,commons-io.jar
2.在struts.xml 中加入如下代码:
<action name="downloadfile" class="download.DownloadAction"> <result name="success" type="stream"> <param name="contentType">application/octet-stream</param> <param name="contentDisposition">attachment;filename="${filename}"</param> <param name="inputName">downloadFile</param> <param name="bufferSize">4096</param> </result> </action>
*注意:
1.${filename}为对应Action中的属性值,有对应的getter,setter方法 2. <param name="inputName">downloadFile</param> 中downloadFile是要返回 inputstream类型的方法名对应的名字(本例中如public InputStream getDownloadFile())
3.对应的action代码
package download;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.usc.utils.UploadConfigurationRead;
public class DownloadAction extends ActionSupport
{
private static final long serialVersionUID = 6329383258366253255L;
private String fileName;
private String fileRealName;
public void setFileName()
{
// 得到请求下载的文件名
String fname = ServletActionContext.getRequest().getParameter("name");
String frealname = ServletActionContext.getRequest().getParameter("realname");
try
{
/*
* 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
* 这里使用request.setCharacterEncoding解码无效.
* 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
*/
fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8");
frealname= new String(frealname.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e)
{
e.printStackTrace();
}
this.fileName = fname;
this.fileRealName = frealname;
}
/*
* @getFileName 此方法对应的是struts.xml文件中的: <param
* name="contentDisposition">attachment;filename="${fileName}"</param>
* 这个属性设置的是下载工具下载文件时显示的文件名, 要想正确的显示中文文件名,
*我们需要对fileName再次编码
* 否则中文名文件将出现乱码,或无法下载的情况
*/
public String getFileName() throws UnsupportedEncodingException
{
fileRealName = new String(fileRealName.getBytes(), "ISO-8859-1");
return fileRealName;
}
/*
* @getDownloadFile 此方法对应的是struts.xml文件中的: <param
* name="inputName">downloadFile</param> 返回下载文件的流,可以参看struts2的源码
*/
public InputStream getDownloadFile()
{
this.setFileName();
return ServletActionContext.getServletContext().getResourceAsStream("/"+
UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim()+"/" + fileName
//文件路径
);
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
4.和一般的sturts2的web.xml文件一样加入如下代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
5.在页面调用方法:
<a href="downloadfile.action">download</a>