package cn.iecast.servlet;
import sun.misc.BASE64Encoder;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@WebServlet("/downloadServlet")
/**
@Author:Chen
@Description:
@Date:10:42 2019/6/1
**/
public class downLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.huoqu文件名称
String fileName=request.getParameter("fileName");
// 2.加载进内存
ServletContext servletContext=this.getServletContext();
String agent=request.getHeader("user-agent");
//根据浏览器,确定fileName为中文时的编码方式
fileName=getFileName(agent,fileName);
String file=servletContext.getRealPath("/img/"+fileName);
FileInputStream fis=new FileInputStream(file);
// 3设置response的响应头
// 3.1设置响应头类型
// MIMEl类型:大类型/小类型
// eg:text/html 定义成html形式的纯文本
String mime=servletContext.getMimeType(fileName);//获取MIME值
response.setContentType(mime);
// 3.2 设置响应头的打开方式,attachment表示附件形式上传,filename的值为浏览器中显示的附件名称
response.setHeader("content-disposition","attachment;filename="+fileName);
// 4.流的对拷
ServletOutputStream sr=response.getOutputStream();
byte[] buff=new byte[1024*8];
int len=0;
// 从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数
// 运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节
// 第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度。
// 如果没有可用的字节,因为已经到达流的末尾, -1返回的值
// 如果b.length==0,则返回0
while((len=fis.read(buff))!=-1){
sr.write(buff,0,len);
}
fis.close();
}
//工具类,根据浏览器版本,实现中文显示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
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");
}
return filename;
}
}
浏览器点击超链接后实现文件下载
最新推荐文章于 2023-11-11 11:10:50 发布