javaweb 文件名下载乱码问题终极解决方案
来源:互联网 发布:sql创建会员信息表 编辑:程序博客网 时间:2024/06/05 18:39
之前看很多博客都是通过 判断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); }}
阅读全文
1 0
- javaweb 文件名下载乱码问题终极解决方案
- springmvc文件下载之文件名下划线问题终极解决方案
- 转载:终极解决下载文件名乱码
- Google Chrome 下载文件名乱码问题的解决方案
- IE6下载文件名过长导致乱码问题的解决方案
- java 下载文件名乱码解决方案+上传时 文件名乱码
- 下载中文文件名乱码问题
- 中文文件名下载乱码问题
- 下载附件文件名乱码问题
- java 下载文件名乱码问题
- 文件下载,IE下文件名乱码【解决方案】
- 下载资源文件名,出线中文乱码解决方案.
- 文件名 乱码终极解决
- JSP中文乱码问题终极解决方案
- JSP中文乱码问题终极解决方案
- JSP中文乱码问题终极解决方案
- Mysql中乱码问题的终极解决方案
- JSP中文乱码问题终极解决方案
- Eclipse自动生成方法注释 快捷键
- Looksery Cup 2015 C. The Game Of Parity —— 博弈
- 593. Valid Square
- 05SQLite
- time模块
- javaweb 文件名下载乱码问题终极解决方案
- django nginx 服务器部署
- jQuery 杂项方法
- Also sprach ich
- Eclipse添加JavaEE和WEB插件
- ncre不能支付
- 06运用手机多媒体
- Java线程简单总结
- SpringMVC工作原理