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;