<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/login/img/九尾.jpg">图片1</a>
<a href="/login/img/html视频.avi">视频</a>
<hr>
<a href="/login/DownServlet?fileName=牛B一样的人.jpg">图片1</a>
<a href="/login/DownServlet?fileName=html视频.avi">视频</a>
</body>
</html>
下载的Servlet处理步骤
package cn.kkforhai.web.servletDemo;
import cn.kkforhai.utiltools.DownLoadUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author KuKaFei.Hai
* @date 2020/5/25 : 16:36
*/
@WebServlet("/DownServlet")
public class DownServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据文件名,找到文件在服务器上的位置,
//1 从超链接中获取 传过来的文件名
String desName = req.getParameter("fileName");
//利用ServletContext
//2 获取ServletContext对象
ServletContext thisContext = this.getServletContext();
//3 根据名字找到服务器上资源真正的路径
String realPath = thisContext.getRealPath("/img/" + desName);
//4 创建字节流对象,加进内存
FileInputStream fis = new FileInputStream(realPath);
// 要使客户端,弹出下载框,对response对象做相应的设置
//5 获取下载文件的类型
String mimeType = thisContext.getMimeType(desName);
//6 设置响应头,contect-type
resp.setHeader("content-type",mimeType);
//7 获取客户是什么浏览器
String agent = req.getHeader("user-agent");
//8 根据浏览器来设置中文信息
desName = DownLoadUtils.getFileName(agent, desName);
//下载文件以弹窗(附件的形式)的方式打开,并告诉文件名是什么
resp.setHeader("content-disposition","attachment;filename="+desName);
//把输入流写到输出流中 流的对拷
//获取输出流
ServletOutputStream sos = resp.getOutputStream();
//定义每次读写的大小
byte[] byteBuff = new byte[1024 * 8];
//定义是否读写到文件尾的标志
int flag =0;
while ((flag = fis.read(byteBuff))!=-1) {
sos.write(byteBuff,0,flag);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
处理64位字符的工具类
package cn.kkforhai.utiltools;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class DownLoadUtils {
/**
*
* @param agent
* @param filename
* @return
* @throws UnsupportedEncodingException
*/
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, StandardCharsets.UTF_8);
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
Base64.Encoder base64Encoder = Base64.getEncoder();
//BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}