解决文件名下载中文名无法解析问题

问题:

本地文件部署到服务器上时,如果文件的名字为中文,虽然文件能够从浏览器下载,但是文件的名字解析不出来。
如:我要下载一个名字为球员的图片

<a href="/Response/downLoad1?filename=球员.jpg">中文名称图片下载</a>

在这里插入图片描述

解决措施:

1.获取客户端使用的浏览器版本信息
2.根据不同的浏览器版本信息,设置filename的编码格式不同

public class DownLoadeUtilis {
    
    
    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
    
    
        if (agent.contains("MSIE")) {
    
    
// IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", "");
        } else if (agent.contains("Firefox")) {
    
    
//火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
    
    
// 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");

        }
        return filename;

    }
}

接口中,在获取文件名之前,先解析文件名。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    //1.获取请求参数,文件名称
    String fileName =request.getParameter("filename");
    System.out.println(fileName); //photo
    
    //2.使用字节流,加载文件进内存
    //2.1找到文件所在的服务器路径
    ServletContext servletContext = request.getServletContext();
    String realPath = servletContext.getRealPath("/img/" + fileName);//图片的真是路径
    //2.2使用字节流关联
    FileInputStream fis = new FileInputStream(realPath);
    //自己理解为,通过此步骤,可以获取从浏览器把文件保存到本地的权限


    //3.设置response响应头
    //3.1设置响应头的数据类型:content-type  //因为我们也不知道文件的类型,所以需要设置。
    String mimeType = servletContext.getMimeType(fileName);
    response.setHeader("content-type",mimeType);
    //3.1.1解决中文文件名问题
    //获取user-agent请求头
    String agent = request.getHeader("user-agent");
    String fileName1 = DownLoadeUtilis.getFileName(agent, fileName);

    //3.2设置响应头的打开方式
    response.setHeader("content-disposition","attachment;filename="+fileName);//filename设置的为下载提示框的名字
    
    //4.将输入流的数据写出到输出流中
    ServletOutputStream sos = response.getOutputStream();
    byte[] buff = new byte[1024*8];
    int len = 0;
    while ((len=fis.read(buff))!=-1){
    
    
        sos.write(buff,0,len);
    }
    fis.close();//输入流关闭

}

猜你喜欢

转载自blog.csdn.net/zhang19903848257/article/details/107426726