package com.itheima.download;
import java.io.FileInputStream;
import java.io.IOException;
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 sun.misc.BASE64Encoder;
public class DownloadServlet extends HttpServlet {
/*
* 编写让浏览器下载的Servlet程序
准备工作:①工作空间的建立②文件配置③html文件创建,超链接④工具文件夹的vc导入---> 不想被外界访问v在web-inf里面
* 实现步骤:
* 1. 获取被下载的图片的绝对路径
* 2. 获取图片文件的MIME类型
* 3. 设置响应头,告知浏览器响应的文件MIME类型
* 4. 设置响应头,告知浏览器不要打开,请你下载
* 5. IO读取图片,写会浏览器
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取被下载的图片的绝对路径
String path = getServletContext().getRealPath("download/a.jpg");
//2. 获取图片文件的MIME类型
//ServletContext对象,方法,可以直接获取该文件的MIME类型
String mime = getServletContext().getMimeType(path);
//3. 设置响应头,告知浏览器响应的文件MIME类型
response.setContentType(mime);
String filename = "美女.jpg"; //这是根据功能实现的需要,自己编写文件类型的名字,不是固定格式
String agent = request.getHeader("User-Agent");
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
//但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编//码方式不同,ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容//性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别.所以紫色部分可以直接拿过//来用就可以,但是要注意导包的正确,核对导包在最上面
//4. 设置响应头,告知浏览器不要打开,请你下载
response.setHeader("Content-Disposition","attachment;filename="+filename); //这是官方的编写格式,不能修改,直接vc拿来用即可
//5. IO读取图片,写会浏览器
FileInputStream fis = new FileInputStream(path);
OutputStream out = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
fis.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}