1、下载servlet
public class DownLoadServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户下载的文件名称(url地址后追加数据,get)
String fileName = request.getParameter("fileName");
//获取上传目录路径
String filePath = getServletContext().getRealPath("/upload")+"/"+fileName;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bis = new BufferedInputStream(new FileInputStream(filePath));
bos = new BufferedOutputStream(response.getOutputStream());
long fileLength = new File(filePath).length();
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data");
/*
* 解决各浏览器的中文乱码问题
*/
String userAgent = request.getHeader("User-Agent");
//IE浏览器的编码设置
if(userAgent.contains("MSIE")
||userAgent.contains("rv:11")){
fileName = URLEncoder.encode(fileName, "UTF-8");
} else{
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));
response.setHeader("Content-Length", String.valueOf(fileLength));
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
结语
首先明确基础知识:InputStream与FileInputStream等都是对内存而言,
那么文件输入流一定是向内存输入流,这对文件下载是有用的。
本质理解下载文件过程:
第一步:就是要下载的文件放到或叫关联到输入流中: 把文件放到内存
new FileInputStream(“d:\test.txt”)
第二步:把输入流转换成输出流,即data从内存放到文件当中去,由此完成了文件下载功能。
YE的IP抓包下载Excel原理 就是利用这种输出流的方式:
InputStream in=new FileInputStream(temp);
outStream(in);
temp.delete();
第三步:再配合以下对浏览器的控制:
response.setContentType(“application/vnd.ms-excel; charset=GBK”);
String fileName=buildTitle()+”.xls”;
response.setHeader(“Content-disposition”,”attachment; filename=”+new String(fileName.getBytes(“GB2312”),”ISO-8859-1”));