后端主流框架-SpringMvc-day2

Java中的文件下载

2 文件下载

文件下载:就是将服务器(表现在浏览器中)中的资源下载(复制)到本地磁盘;

2.1 前台代码
  1. 前台使用超链接,超链接转到后台控制器,在控制器通过流的方式进行操作;

后端主流框架-SpringMvc-day2_第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”,问题就出现了?
后端主流框架-SpringMvc-day2_第2张图片

解决方法:兼容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;

你可能感兴趣的:(数据库)