需求:
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
分析
- 超链接指向的资源如果能被浏览器解析, 则在浏览器中展示, 如果不解析, 则弹出下载提示框
- 任何资源都必须弹出下载提示框
- 使用响应头设置资源的打开方式
content-disposition:attachment;filename=xxx
步骤
- 定义页面,编辑超链接href属性, 指向Servlet, 传递资源的名称filename
- 定义Servlet
①获取文件名称
②使用字节输入流加载文件进内存
③指定response的响应头:content-disposition:attachment;filename=xxx
④将数据写到response输出流
准备好测试的图片和视频
代码展示
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="./img/1.png">图片1</a>
<a href="./img/2.mp4">视频</a>
<hr>
<a href="/downLoadServlet?filename=/1.png">图片1</a>
<a href="/downLoadServlet?filename=/2.mp4">视频</a>
</body>
</html>
downLoadServlet类
package download;
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;
@WebServlet("/downLoadServlet")
public class DownLoadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 获取请求参数,文件名称
*/
String filename = request.getParameter("filename");
/**
* 使用字节输入流加载文件进内存
*/
//找到文件服务器的路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img" + filename);
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
/**
* 设置response的响应头
*/
//设置相应头类型content-type
String mimeType = servletContext.getMimeType(filename);//获取文件的Mine类型
response.setHeader("content-type",mimeType);
//设置你响应头打开方式content-disposition
response.setHeader("content-disposition","attachment;filename="+filename);
/*
指定response的响应头:content-disposition:attachment;filename=xxx
*/
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len=0;
while ((len=fis.read(buff))!=-1){
//没有读到文件的末尾
sos.write(buff,0,len);//输出流不停往外写
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果
启动浏览器, 观察结果