Java中的文件下载
2 文件下载
文件下载:就是将服务器(表现在浏览器中)中的资源下载(复制)到本地磁盘;
2.1 前台代码
- 前台使用超链接,超链接转到后台控制器,在控制器通过流的方式进行操作;
2.2 后台代码
@Controller
public class DownloadController {
@RequestMapping("/download")
public void download(String filename,HttpServletRequest req,HttpServletResponse resp) throws Exception{
//1.获取输入流
//1.1.获取文件在服务器的绝对路径
String parentPath = req.getServletContext().getRealPath("/download");
File file = new File(parentPath, filename);
if(file.exists()){
FileInputStream in = new FileInputStream(file);
//2.获取输出流
//2.1.设置文件下载的名字 -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了
resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
//2.2.获取输出流
ServletOutputStream out = resp.getOutputStream();
//3.实现下载
IOUtils.copy(in, out);
//关流,释放资源
out.close();
in.close();
}
}
}
2.3 解决中文问题
问题描述:当下载 “美女.rar”,问题就出现了?
解决方法:兼容IE、edge和其他浏览器
分析: 如果是IE或edge就用URLEncoder,如果是其他浏览器就要用以下方式解决:
new String(name.getBytes(“UTF-8”),“ISO-8859-1”)
user–agent:这个请求头是指用户代理的意思,告诉服务器使什么浏览器;
@Controller
public class DownloadController {
@RequestMapping("/download")
public void download(String filename,HttpServletRequest req,HttpServletResponse resp) throws Exception{
//1.获取输入流
//1.1.获取文件在服务器的绝对路径
String parentPath = req.getServletContext().getRealPath("/download");
File file = new File(parentPath, filename);
if(file.exists()){
FileInputStream in = new FileInputStream(file);
//2.获取输出流
//2.1.中文文件名称处理(ie和edge都是微软的浏览器 -- 处理方式一样)
//区分浏览器,User-Agent中有浏览器的信息,trident是ie引擎名称,具体:
//mozilla/5.0 (windows nt 6.2; win64; x64; trident/7.0; rv:11.0) like gecko【eclipse自带ie浏览器】
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
//Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763【电脑安装的edge浏览器】
//mozilla/5.0 (windows nt 10.0; win64; x64; rv:68.0) gecko/20100101 firefox/68.0【火狐】
//mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/73.0.3683.86 safari/537.36【谷歌】
//ie浏览器
if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
filename = URLEncoder.encode(filename, "utf-8");
//电脑自带edge【edʒ】浏览器
}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){
filename = URLEncoder.encode(filename, "utf-8");
}else{//其他浏览器
filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");//转码的方式
};
//2.2.设置文件下载的名字 -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了
resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
//2.3.获取输出流
ServletOutputStream out = resp.getOutputStream();
//3.实现下载
IOUtils.copy(in, out);
//关流,释放资源
out.close();
in.close();
}
}
}
页面:
<a href='/download?fileName=<%=URLEncoder.encode("美女.jpg", "utf-8") %>'>美女.jpg</a>
注:Microsoft Edge和IE的最大区别就是Edge 是windows 10 之后有微软推出的浏览器,而在windows 10 之前微软系统自家浏览器都是IE;