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("下载资源流异常");
        }
        
	}






原文地址:https://www.cnblogs.com/dulinan/p/12033102.html