1)什么情况下会文件下载?
浏览器不能解析的就文件下载
2)什么情况下需要在服务器上编写文件下载代码?
理论上,浏览器可以解析的代码需要编写文件下载代码。
实际开发中,只要是需要下载的文件都需要编写文件下载代码。
文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中
图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方 式。
1)告知浏览器文件的类型:response.setContentType(文件的MIME类型);
2)告示浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");
步骤:
1)获得需要下载的文件名称
String filename = request.getParameter("filename");
2)要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型response.setContentType(this.getServletContext().getMimeType(filename));
3)告诉客户端不是此文件不是直接解析,而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
4)获得文件的绝对路径
String path = this.getServletContext().getRealPath("download/"+filename);
5)获得文件的输入流
InputStream in = new FileInputStream(path);
6)获得输出流---通过response获得输出流,用于向客户端写内容
ServletOutputStream out = response.getOutputStream();
7)文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
8)最后需要关闭输入与输出流,输入流为自己new的对象一定得手动关闭,输出流可以通过系统判断自动关闭
in.close();
//out.close();
servlet代码:
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获得需要下载的文件名称
String filename = request.getParameter("filename");
//要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
//告诉客户端不是此文件不是直接解析,而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获得文件的绝对路径
String path = this.getServletContext().getRealPath("download/"+filename);
//获得文件的输入流
InputStream in = new FileInputStream(path);
//获得输出流---通过response获得输出流,用于向客户端写内容
ServletOutputStream out = response.getOutputStream();
//文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a>使用a标签指向服务器的资源</a><br>
<a href="/WEB14/download/a.flv">a.flv</a><br>
<a href="/WEB14/download/a.jpg">a.jpg</a><br>
<a href="/WEB14/download/a.mp3">a.mp3</a><br>
<a href="/WEB14/download/a.mp4">a.mp4</a><br>
<a href="/WEB14/download/a.txt">a.txt</a><br>
<a href="/WEB14/download/a.zip">a.zip</a><br>
<a>使用服务端编码的方式实现文件下载</a><br>
<a href="/WEB14/downloadServlet?filename=a.flv">a.flv</a><br>
<a href="/WEB14/downloadServlet?filename=a.jpg">a.jpg</a><br>
<a href="/WEB14/downloadServlet?filename=a.mp3">a.mp3</a><br>
<a href="/WEB14/downloadServlet?filename=a.mp4">a.mp4</a><br>
<a href="/WEB14/downloadServlet?filename=a.txt">a.txt</a><br>
<a href="/WEB14/downloadServlet?filename=a.zip">a.zip</a><br>
</body>
</html>
但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别
image.png
image.png
网友评论