文件下载
本质就是将一台电脑(服务器)中的文件根据网络协议通过io流传递到另外一台电脑上。
文件下载两种形式
- 超链接如果浏览器支持这个格式的文件.可以在浏览器中打开.如果浏览器不支持这个格式的文 件才会提示下载.
- 手动编写代码的方式下载
手动编写代码实现下载
1. 设置媒体类型
2. 设置下载窗口
3. 开始读写
代码实现:
@WebServlet(name = "DownLoadServlet",urlPatterns = "/download")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
public String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("utf-8"))) + "?=";
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 文件下载:将服务器中的文件拷贝到本地电脑中
String fileName = req.getParameter("fileName");
String userAgent = req.getHeader("User‐Agent");
String newFileName = null;
if ("Chrome".equals(userAgent)) {
newFileName = URLEncoder.encode(fileName, "utf-8");
} else {
newFileName = base64EncodeFileName(fileName);
}
String mimeType = req.getServletContext().getMimeType(fileName);
resp.setContentType(mimeType);
resp.setHeader("Content-Disposition", "attachement;filename=" + newFileName);
String inPath = req.getServletContext().getRealPath("upload") + File.separator + fileName;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inPath));
ServletOutputStream outputStream = resp.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
int len = -1;
byte[] bys = new byte[8192];
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bis.close();
bos.close();
}
}
解决下载文件名中文乱码问题
因为每个浏览器的不同内核到导致文件下载编码不同所以要解决文件名乱码
String userAgent = req.getHeader("User‐Agent");
String newFileName = null;
if ("Chrome".equals(userAgent)) {
// 谷歌浏览器
newFileName = URLEncoder.encode(fileName, "utf-8");
} else {
newFileName = base64EncodeFileName(fileName);
}
public String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("utf-8"))) + "?=";
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}