java通用格式下载,中文乱码解决

来源:互联网 发布:linux启动nodejs项目 编辑:程序博客网 时间:2024/04/30 01:25

从网上看到了好多关于文件下载的问题,我之前也遇到过。比如在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("下载资源流异常");        }        }


1 0