xml中配置
<action name="download" class="com.test.DownloadTest">
<param name="inputPath">/备忘.txt</param>
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="备忘文件.txt"</param>
<param name="bufferSize">4096</param>
</result>
</action>
Action中代码
package com.test;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadTest extends ActionSupport {
private static final long serialVersionUID = -2459892982073583733L;
private String inputPath;
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getTargetFile() throws Exception {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
}
但是这样没有解决下载时候的保存文件名不是正确的文件名的问题。
而且每一个中文文件需要对应一个文件。很不方便。我自己设计了一个标签和一个servlet,专门处理这个问题,并且所有的文件不管在tomcat的web.xml中如何设置mime类型,都会弹出下载对话框,而不是应用相应的程序进行打开。
下面是标签库处理类
package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyJspTag extends SimpleTagSupport{
private String url;
private String display;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().println("<a href=\"downloadServlet?path=" + url + "\">" + display + "</a>");
}
}
下面是标签的tld文件
<?xml version="1.0" encoding="UTF-8" ?> <taglib 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-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>mytaglib</short-name> <uri>my-tag</uri> <tag> <name>downloadLink</name> <tag-class>com.tag.MyJspTag</tag-class> <body-content>empty</body-content> <attribute> <name>url</name> <required>true</required> <fragment>true</fragment> </attribute> <attribute> <name>display</name> <required>true</required> <fragment>true</fragment> </attribute> </tag> </taglib>
下面是web.xml中对servlet的配置 , 需要将上述tld文件放置在web-inf文件夹下面
<servlet> <servlet-name>downloadServlet</servlet-name> <servlet-class>com.test.DownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>downloadServlet</servlet-name> <url-pattern>/downloadServlet</url-pattern> </servlet-mapping>
下面是Servlet的处理
package com.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 8438995458642112537L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getParameter("path");
if(path != null && !path.trim().equals("")) {
path = new String(path.getBytes("iso-8859-1") , "utf-8");
String realPath = request.getSession().getServletContext().getRealPath(path);
File file = new File(realPath);
if(file.exists() && file.isFile()) {
InputStream in = null;
try{
in = new FileInputStream(realPath);
}catch (Exception e) {
PrintWriter pw = response.getWriter();
pw.println("您请求的资源 " + path + " 不存在");
pw.close();
return;
}
String fileName = "";
if(realPath.indexOf("\\") == -1) {
fileName = realPath;
} else {
fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
}
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes() , "iso-8859-1"));
OutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
} else {
PrintWriter pw = response.getWriter();
pw.println("您请求的资源 " + path + " 不是文件或文件不存在");
pw.close();
return;
}
} else {
PrintWriter pw = response.getWriter();
pw.println("错误的空资源");
pw.close();
}
}
}
下面是jsp中怎样应用标签
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="mytag" uri="/WEB-INF/mytag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<mytag:downloadLink url="中文1.rar" display="中文1"/>
<mytag:downloadLink url="中文2.txt" display="中文2"/>
</body>
</html>
显示的超链接是这样的。经测试在firefox和ie上基本能够正确处理下载问题。
<a href ="downloadServlet?path=%E4%B8%AD%E6%96%871.rar" >中文1</a > <a href ="downloadServlet?path=%E4%B8%AD%E6%96%872.txt" >中文2</a >