举例抛现
实现
举例抛现
还是先来个页面吧,里面有2个超链接,一个是图片路径,一个是视频路径
项目
file.html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件下载</title> </head> <body> <a href="/file/2.jpg">图片</a> <a href="/file/aa.mp4">视频</a> </body> </html>
运行浏览器访问
单击图片显示
单击视频显示
所以是单击图片的时候,能被高级浏览器解析,直接显示,单击视频的时候提示下载,现在想要的效果是无论是图片还是视频,我们多要弹框提示下载
实现
那么我们把file.html页面修改一下,不直接访问文件,而是调到Servlet层
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="/bServlet/dowmloadFile1?fileName=2.jpg">图片</a>
<a href="/bServlet/dowmloadFile1?fileName=aa.mp4">视频</a>
</body>
</html>
Servlet层dowmloadFile1的代码
package com.lingaolu.download;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
/**
* @author 林高禄
* @create 2020-07-14-9:11
*/
@WebServlet("/dowmloadFile1")
public class DowmloadFile1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取文件名
String fileName = request.getParameter("fileName");
// 获取文件的MIME类型
ServletContext servletContext = this.getServletContext();
String mimeType = servletContext.getMimeType(fileName);
// 获取文件的真实路径
String realPath = servletContext.getRealPath("/file/" + fileName);
// 将文件读入内存
FileInputStream fis = new FileInputStream(realPath);
// 设置相应头类型
response.setHeader("content-type",mimeType);
response.setHeader("content-disposition","attachment;filename="+fileName);
// 将文件写出浏览器
ServletOutputStream outputStream = response.getOutputStream();
int len;
byte[] by = new byte[1024*8];
while((len = fis.read(by)) != -1){
outputStream.write(by,0,len);
}
fis.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
启动访问,谷歌浏览器访问
单击图片,会下载,因为谷歌浏览器设置自动下载
单击视频,会提示下载,因为我谷歌浏览器设置扩展程序关联迅雷
用IE浏览器访问
无论单击图片还是视频,都会提示下载,因为IE浏览器我没有设置
文件名中文问题