zoukankan      html  css  js  c++  java
  • java通用格式下载,中文乱码解决

    从网上看到了好多关于文件下载的问题,我之前也遇到过。比如在ff/chrome/360都好用,但在ie下乱码。或者中文转码后中文部门丢失等。今天整理下文件下载的问题,亲测ie,ff,chrome,360都能显示中文名,并且支持图片、office等通用文件的下载,下面附上代码

    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    
    import javax.activation.MimetypesFileTypeMap;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import sun.misc.BASE64Encoder;
    
    public static void downloadFile(String filename, String filePath,
    			HttpServletRequest request, HttpServletResponse response) {
    		try {
    	        // 1.得到下载文件的名称.必须处理乱码.
    	        filename = new String(filename.getBytes("iso8859-1"), "utf-8");
    	        
    	        // 2.从upload目录下查找filename文件是否存在。
    	        File file = new File(filePath);
    	        
    	        // 下载设置
    	        // 1.设置mimetype类型
    	        
    	        String mimeType = new MimetypesFileTypeMap().getContentType(file);
    	        response.setContentType(mimeType); // 根据文件名获取这种文件的mimeType值,设置到http响应头中。
    	        
    	        // 以下代码解决了浏览器显示下载文件名乱码问题
    	        String agent = request.getHeader("User-agent");
    	        String viewfilename = null;
    	        if (agent.contains("MSIE")) {
    	        	// IE浏览器
    	        	viewfilename = URLEncoder.encode(filename, "utf-8");
    
    	        } else if (agent.contains("Firefox")) {
    	        	// 火狐浏览器
    	        	BASE64Encoder base64Encoder = new BASE64Encoder();
    	        	viewfilename = "=?utf-8?B?"
    	        			+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    	        } else if (agent.contains("Chrome")) {
    	        	// google浏览器
    	        	viewfilename = URLEncoder.encode(filename, "utf-8");
    	        } else {
    	        	// 其它浏览器
    	        	viewfilename = URLEncoder.encode(filename, "utf-8");
    	        }
    	        
    	        // 2.设置响应头 Content-Dispositon.
    	        response.setHeader("Content-Disposition", "attachment;filename="
    	        		+ viewfilename);
    
    	        if (file.exists()) {
    	        	// 存在
    	        	// 3.通过输入流将这个文件内容读取出来,通过response获取输出流,写回到浏览器.
    	        	FileInputStream fis = new FileInputStream(file);
    
    	        	OutputStream os = response.getOutputStream();
    
    	        	int len = -1;
    	        	byte[] b = new byte[1024];
    
    	        	while ((len = fis.read(b)) != -1) {
    	        		os.write(b, 0, len);
    	        		os.flush();
    	        	}
    	        	try {
    	                fis.close();
    	                os.close();
    	            }
    	            catch (IOException e1) {
    	                e1.printStackTrace();
    	            }
    
    	        } else {
    	        	// 不存在
    	        	throw new RuntimeException("下载资源不存在");
    	        }
            }
            catch (UnsupportedEncodingException e) {
            	e.printStackTrace();
            	throw new RuntimeException("下载资源名称转码异常");
            }
            catch (FileNotFoundException e) {
    	        e.printStackTrace();
    	        throw new RuntimeException("下载资源不存在");
            }
            catch (IOException e) {
    	        e.printStackTrace();
    	        throw new RuntimeException("下载资源流异常");
            }
            
    	}
    
    
    
    
    


  • 相关阅读:
    C# 系统应用之通过注册表获取USB使用记录(一)
    web项目测试方法总结
    C#面向对象编程实例-猜拳游戏
    c#基础这些你都看过吗?(一)-----仅供初学者使用
    .NET事件监听机制的局限与扩展
    SQL代码
    泛型接口委托
    存储过程
    小操作
    DataGridView
  • 原文地址:https://www.cnblogs.com/dulinan/p/12033102.html
Copyright © 2011-2022 走看看