response-综合案例-文件的下载
Servlet代码如下:
package com.lbl.servlet;
import com.lbl.servlet.service.FileService;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
@WebServlet("/downloadServlet2")
public class DownloadServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数中的文件名
String filename = request.getParameter("filename");
String saveName = getFileName(request, filename);
//自动根据文件的后缀名,获取mime-type类型 .jpg image/jpeg
String mimeType = getServletContext().getMimeType(filename);
System.out.println(mimeType);
//指令,调用浏览器弹出下载框,由用户自己保存
response.setHeader("Content-Type",mimeType);
response.setHeader("Content-Disposition", "attachment;filename="+saveName);
//加载a.jpg文件成为一个输入流
InputStream inputStream = getServletContext().getResourceAsStream("download/" + filename);
//再使用字节流,将数据写到浏览器
OutputStream outputStream = response.getOutputStream();
//浏览器自动将数据显示成图片
FileService fileService = new FileService();
fileService.copy(inputStream,outputStream);
//关闭资源
outputStream.close();
inputStream.close();
}
public String getFileName(HttpServletRequest request,String filename) throws UnsupportedEncodingException {
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");
}
return filename;
}
}
FileService代码如下:
package com.lbl.servlet.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
//文件业务类
public class FileService {
//复制文件
public void copy(InputStream inputStream, OutputStream outputStream) throws IOException {
//边读边写
//1:字节数组 缓冲区
byte[] buffer=new byte[1024];
int len = 0;
//2:边读边写
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
}
}
前端index.jsp代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="/Day03_war_exploded2/downloadServlet2?filename=a.jpg">点一点看图片</a><br/>
<a href="/Day03_war_exploded2/downloadServlet2?filename=a.mp3">点一点看mp3</a><br/>
<a href="/Day03_war_exploded2/downloadServlet2?filename=a.mp4">点一点看mp4</a><br/>
<a href="/Day03_war_exploded2/downloadServlet2?filename=a.zip">点一点看zip</a><br/>
</body>
</html>
效果如下: