解决各大浏览器下载文件,文件名中文乱码的问题

https://blog.csdn.net/fengchao2016/article/details/55188805/

使用Trident和Edge关键字来判断是否是微软的浏览器(微软抛弃了IE,开始使用Edge了),在下载时,首先判断是否是微软的浏览器,如果是,用utf-8对文件名进行编码,如果不是,使用万能解决乱码。

public static void fileDownload(final HttpServletResponse response, String filePath, String fileName) throws Exception{  
		byte[] data = FileUtil.toByteArray2(filePath);
		
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes()).getRequest();
		//解决下载文件时 中文文件名乱码问题
		boolean isMSIE = isMSBrowser(request);  
        if (isMSIE) {  
          //IE浏览器的乱码问题解决
              fileName = URLEncoder.encode(fileName, "UTF-8");  
        } else {  
          //万能乱码问题解决
              fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");  
        } 
	    
	    response.reset();  
	    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");  
	    response.addHeader("Content-Length", "" + data.length);  
	    response.setContentType("application/octet-stream;charset=UTF-8");  
	    OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());  
	    outputStream.write(data);  
	    outputStream.flush();  
	    outputStream.close();
	    response.flushBuffer();
	} 
	
	//判断是否是ie浏览器
	private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
	
	public static boolean isMSBrowser(HttpServletRequest request) {  
         String userAgent = request.getHeader("User-Agent");  
         for (String signal : IEBrowserSignals) {  
             if (userAgent.contains(signal))  
                 return true;  
         }  
         return false;  
     }

猜你喜欢

转载自blog.csdn.net/NRlovestudy/article/details/85262351