DownloadServlet.java package cn.web.servlet;import java.io.FileInputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.ServletO
package cn.web.servlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1.1获取下载资源文件的名称
String filename = request.getParameter("filename");
//1.2 解决中文乱码问题
filename = new String(filename.getBytes("iso8859-1"),"UTF-8");
// 2.获取下载文件的路径
String realPath = this.getServletContext().getRealPath("download/"+filename);
System.out.println(realPath);
//3.设置两个头(ContentType和Content-Disposition)
//3.1 先得获取ContentType的内容(MIME类型)
String mimeType = this.getServletContext().getMimeType(filename);
//System.out.println(mimeType);
//3.2设置contentType
response.setHeader("ContentType", mimeType);
//3.3解决下载框中文(根据不同的浏览器设置不同的解决方式)
String user_Agent = request.getHeader("User-Agent");
if(user_Agent.contains("Firefox")){ //解决火狐的
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename, "UTF-8");
}
//3.4 设置Content-Disposition内容 告诉浏览器请使用下载框的方式打开该文件
response.addHeader("Content-Disposition", "attachment;filename="+filename);
// 4.获得输入一个流
FileInputStream is = new FileInputStream(realPath);
// 5.获得一个输出流
ServletOutputStream os = response.getOutputStream();
// 6.输入流输出流对拷
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
os.close();
is.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/**
* 解决火狐浏览器乱码问题
* @param fileName
* @return
*/
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);
}
}
}
