步骤:
- 在Action里面写一个返回值类型为InputStream的方法。
public class DownloadAction { //文件名 private String fileName; public String execute() { return "success"; }
public InputStream getInputStream() throws FileNotFoundException, UnsupportedEncodingException { //获取下载目录 String path=ServletActionContext.getServletContext().getRealPath("/files"); return new FileInputStream(new File(path,fileName)); } //设置fileName编码防止下载不了中文名称文件 public String getFileName() throws UnsupportedEncodingException { return new String(fileName.getBytes("ISO8859-1"),"utf-8"); } public void setFileName(String fileName) throws Exception { this.fileName = new String(fileName.getBytes("ISO8859-1"),"utf-8"); }
|
- struts.xml里面配置result的type为stream
<action name="download" class="com.action.DownloadAction"> <result type="stream"> <!-- inputName要与Action中的Inputstream方法的名称一致 --> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename=${fileName}</param> <!-- 下载中文名文件 --> <param name="contentType">application/octet-stream;charset=UTF-8</param> </result> </action> |
这样写在本地测试中文名称文件可以下载中文会变成空格,但是部署到服务器上面就不行了不知道是什么原因。后续找到了完美下载中文名称文件的时候在更新了。
下载中文名称文件或者带有特殊符号的文件名时大多数情况会出现500错误找不到inputName的方法,把文件名称改成英文不带特殊符号就好了。