javaweb 文件名下载乱码问题终极解决方案

简介: 之前看很多博客都是通过 判断userAgent来处理文件名的中文乱码问题,如下 if (userAgent.indexOf("MSIE")!=-1 || userAgent.

之前看很多博客都是通过 判断userAgent来处理文件名的中文乱码问题,如下

 if (userAgent.indexOf("MSIE")!=-1 || userAgent.indexOf("Trident")!=-1 || userAgent.indexOf("Edge")!=-1 ) {     // ie  
   fileName = new String(fileName.getBytes("GBK"), "iso-8859-1");  
                   } else if (null != userAgent && -1 != userAgent.indexOf("Mozilla")) {           // 火狐,chrome等  
                       fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");  
                   } 

但博主实际开发中发现,这种也不是百分之百有效,最简单粗暴的方式就是把fileName 先BASE64编码存为url,然后下载时候再把fileName用BASE64解码,就可以规避浏览器对中文编码不一致的问题了,代码如下:

package com.nercel.cyberhouse.ws.sns;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.alibaba.fastjson.JSON;
import com.nercel.cyberhouse.util.ServerConfig;
import com.nercel.cyberhouse.vo.UFile;
import com.nercel.cyberhouse.vo.UploadFile;
import java.util.regex.*; 

@Controller
@RequestMapping("sns")
public class FileUpload {
    private String CYBERHOUSE_PATH =  ServerConfig.get("cyberhouse.root");

       @RequestMapping(value = "/uploadFile", produces = "text/plain; charset=utf-8")
       public @ResponseBody String uploadFile(@RequestParam(value = "file", required = false) MultipartFile file,int userId,HttpServletRequest request, HttpServletResponse response) {  
            UploadFile upFile = new UploadFile();
            String path = request.getSession().getServletContext().getRealPath("upload/sns/"+userId+"/");  
          //  String fileName = StringFilter(file.getOriginalFilename());
            String fileName = file.getOriginalFilename();
            String ext=fileName.substring(fileName.lastIndexOf(".")+1);

            if(file.getSize()>1024*1024*50){
                upFile.setCode(1);
                upFile.setMsg("单个文件/图片大小不能超过50M!");
                return JSON.toJSONString(upFile);
            }
            String name=UUID.randomUUID().toString()+"."+ext;
            String downLoadPath=path+"/"+name;
            File targetFile = new File(path,name);  
            if(!targetFile.exists()){  
                targetFile.mkdirs();  
            }  
           try {  
              file.transferTo(targetFile);  
              upFile.setCode(0);
              UFile uf=new UFile();
              uf.setName(fileName);
              byte[] b = null;  
              b = fileName.getBytes("utf-8");  
              uf.setSrc(CYBERHOUSE_PATH+"/sns/downLoadFile?downLoadPath="+downLoadPath+"&fileName="+new BASE64Encoder().encode(b));
              upFile.setData(uf);
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return JSON.toJSONString(upFile);    
      }


        @RequestMapping("/downLoadFile")  
        public void downLoadFile(String downLoadPath, String fileName,HttpServletResponse response,HttpServletRequest request) throws UnsupportedEncodingException {  
             BufferedInputStream bis = null;  
                BufferedOutputStream bos = null;          
                byte[] b = null;  
                String resultFileName = null;  
                    BASE64Decoder decoder = new BASE64Decoder();  
                        try {
                            b = decoder.decodeBuffer(fileName);
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }  
                        resultFileName = new String(b, "utf-8");  

                try {  
                    response.setCharacterEncoding("UTF-8"); 

                    long fileLength = new File(downLoadPath).length();
                    String userAgent = request.getHeader("User-Agent");                
                    response.setHeader("Content-disposition", "attachment; filename="+new String(resultFileName.getBytes("gbk"),"iso-8859-1"));
                    response.setContentType("application/x-download;");

                    response.setHeader("Content-Length", String.valueOf(fileLength));  
                    bis = new BufferedInputStream(new FileInputStream(downLoadPath));  
                    bos = new BufferedOutputStream(response.getOutputStream());  
                    byte[] buff = new byte[2048];  
                    int bytesRead;  
                    while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
                        bos.write(buff, 0, bytesRead);  
                    }  
                    bos.flush();  
                } catch (Exception e) {  
                } finally {  
                    if (bis != null) {  
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }  
                    if (bos != null) {  
                        try {
                            bos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }  
                    }  
                }  
        }  

       // 过滤特殊字符  
       public static String StringFilter(String str) throws PatternSyntaxException{     
              // 清除掉所有特殊字符和空格
              String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、? ]";  
              Pattern p = Pattern.compile(regEx);     
              Matcher m = p.matcher(str);     
              return m.replaceAll("").trim();     
       }

       //layui上传文件公共服务
       @RequestMapping(value = "/upload", produces = "text/plain; charset=utf-8")
       public @ResponseBody String upload(@RequestParam(value = "file", required = false) MultipartFile file,HttpServletRequest request, HttpServletResponse response) {  
            UploadFile upFile = new UploadFile();

            String msg="上传失败!";
            long fileSize = file.getSize();
            System.out.println("fileSize="+fileSize);

            if(fileSize>2097152){
                upFile.setCode(1);
                upFile.setMsg("上传文件不能超过2M!");
                return JSON.toJSONString(upFile);   
            }

            String fileName = StringFilter(file.getOriginalFilename());
            String fileType= fileName.substring(fileName.lastIndexOf(".")+1);
            Date now = new Date(); 
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");//可以方便地修改日期格式
            String today = dateFormat.format(now); 
            String path = request.getSession().getServletContext().getRealPath("upload/layuiUploads/"+fileType+"/"+today);
            String name=UUID.randomUUID().toString()+fileName;
            String downLoadPath=path+"/"+name;
            File targetFile = new File(path,name);  
            if(!targetFile.exists()){  
                targetFile.mkdirs();  
            }  
           try {  
              file.transferTo(targetFile);
              upFile.setCode(0);
              UFile uf=new UFile();
              uf.setName(fileName);
              uf.setSrc(CYBERHOUSE_PATH+"/sns/downLoadFile?downLoadPath="+downLoadPath+"&fileName="+fileName);
              upFile.setData(uf);
              msg="上传成功!";
              upFile.setMsg(msg);
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
           System.out.println(JSON.toJSONString(upFile));
            return JSON.toJSONString(upFile);    
      }

}
目录
相关文章
|
23天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
61 2
|
21天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
26天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
47 2
|
27天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
35 3
|
1月前
|
Java API Apache
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
41 4
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
41 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
40 5
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
67 5
|
2月前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
67 2