package servlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Utils.DownloadUtil;
/**
* Servlet implementation class demo3
*/
public class demo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 获取要下载的文件名字 例如aa.jpg --- inputStream
String fileName = request.getParameter("filename");
// 解决get请求中有中文
fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
// 2. 获取这个文件在tomcat里面的绝对路径地址
String path = getServletContext().getRealPath("download/" + fileName);
/**
*解决下载文件时显示的中文问题
* ie 或者google使用 URLEncoder
* 火狐用 base64
*/
//读取消息头 判断浏览器类型
String clienrType = request.getHeader("User-Agent");
if (clienrType.contains("Firefox")) {
fileName = DownloadUtil.base64EncodeFileName(fileName);
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
// 让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 3. 转化成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
is.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
配套火狐解析工具类
package Utils;
import java.io.UnsupportedEncodingException;
import sun.misc.BASE64Encoder;
public class DownloadUtil {
// 设置火狐下载 中文名称工具类
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
解决
import sun.misc.BASE64Encoder;
不能导入问题
浙公网安备 33010602011771号