javaweb 檔名下載亂碼問題終極解決方案
之前看很多部落格都是通過 判斷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="[`[email protected]#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、? ]";
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);
}
}
相關推薦
javaweb 檔名下載亂碼問題終極解決方案
之前看很多部落格都是通過 判斷userAgent來處理檔名的中文亂碼問題,如下 if (userAgent.indexOf("MSIE")!=-1 || userAgent.indexOf("Trident")!=-1 || userAgent.indexO
IDEA 文檔註釋 亂碼 終極... 解決方案
RM nbsp odin src exe enc 最後一行 span png idea bin 目錄 下 phpstorm64.exe.vmoptions 最後一行添加 : -Dfile.encoding=UTF-8 IDEA 文檔註釋 亂
linux 下navicat 中文亂碼終極解決方案
navicat 也是夠了,直接用了個wine包裝navicat 成了linux版本的了,對此表示無語 此前有很多人說,要更改startnavicat指令碼中的 lang 很明確的說沒有成功,因為 根本不是那的事, 是因為wine的事 解決辦法: 安裝 文泉驛字型
ubtuntu環境下使用matplotlib 繪圖中文亂碼終極解決方案
很多童鞋都喜歡在linux環境下寫程式碼,但是Linux環境下經常會出現如下圖中文亂碼的問題,博主最近在linux下寫python程式時就遇到了matplotlib繪圖時總出現中文變成框框的情況。其他的童鞋也給出了不錯的辦法比如修改全域性環境的方法等,博主
django中文亂碼終極解決方案
pyhon的預設編碼是ASCII編碼,可以通過sys.getdefaultencoding(),為了避免比較麻煩的編碼問題應設定系統預設編碼為utf8 import sys default_encoding = 'utf-8' if sys.getdefaultenco
SSH框架中文亂碼終極解決方案
在java專案開發中,容易發生亂碼,在幾個地方設定,避免亂碼: 以eclipse開發環境為例: 1.開發環境設定成utf-8:在window–preferences–General–Workspace下設定; 2.tomcat配置檔案設定成utf-8:在你
解決OpenOffice格式轉換中文亂碼終極解決方案
今天遇到個很鬱悶的問題,用openOffice 在windows開發環境下轉換ppt,word到pdf,裡面的文字無論中英文都能正常顯示,但是部署到了生產環境(CentOS 7.3.2)之後,轉換的結果全部是亂碼,於是在網上找了一篇文章,步驟寫得很好,按照他的步驟成功解決了問
utf-8編碼的頁面向GBK編碼的頁面提交中文表單亂碼終極解決方案
有關這個問題已經困擾我好多天了,甚至都有點上火,但是最後還是解決了。。 是這樣的,我是做有關讀秀的的請求,但是請求中文無論怎樣都是亂碼,無論是在請求前用js處理,還是用盡各種辦法,就是死活不行,後來到
關於java檔案下載檔名亂碼問題解決方案
JAVA檔案下載時亂碼有兩種情況: 1,下載時中文檔名亂碼 2,下載時因為路徑中包含中文檔名亂碼,提示找不到檔案 解決方法見下面部分程式碼 response.setContentType("multipart/form-data"); String userAgen
JavaWeb 亂碼問題終極解決方案!
rac ssa src 同傳 data strong param cati 一起 經常有讀者在公眾號上問 JavaWeb 亂碼的問題,昨天又有一個小夥伴問及此事,其實這個問題很簡單,但是想要說清楚卻並不容易,因為每個人亂碼的原因都不一樣,給每位小夥伴都把亂碼的原因講一遍也挺
JavaWeb的各種中文亂碼終極解決方法
一、Servlet輸出亂碼 1. 用servlet.getOutStream位元組流輸出中文,假設要輸出的是String str ="釣魚島是中國的,無恥才是日本的"。 1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write(st
終極解決方案——sbt配置阿里映象源,解決sbt下載慢,dump project structure from sbt耗時問題
#sbt下載慢的問題 預設情況下,sbt使用mvn2倉庫下載依賴,如下載scalatest時,idea的sbtshell 顯示如下url https://repo1.maven.org/maven2/org/scalatest/scalatest_2.10/3.0.1/scalatest_2.1
谷歌瀏覽器chrome下載慢的終極解決方案
Before(;´д`)ゞ 我們之前的解決方案 總是新增 Free download 作為預設下載器下載 ; 或者複製下載連結,使用迅雷新建下載任務進行下載 長時間的這樣使用,會覺得很麻煩 因為我們經常要使用瀏覽器下載something; 由於中國防火牆(GFW)的強大,線上下載Go
表單提交後資料中文亂碼的終極解決方案
1、檢視頁面是否使用utf-8編碼 ①jsp頁面: <%@ page language="java" contentType="text/html; charset=UTF-8"
SpringMVC生成Excel和PDF檔案時檔名亂碼的解決方案
解決下載的檔名為中文時的亂碼問題: //將程式碼 response.setHeader("Content-Disposition", "attachment; filename=" + URL
關於Idea裏設置Terminal為Git/bin/bash.exe中文亂碼的問題的終極解決方案
.exe 終極 min program user codepage 註冊 窗口 如果 1.這裏如果設置為Git/git-bash.exe確實不會亂碼,但是每次點Idea裏的Terminal都會彈出一個單獨的terminal窗口而非在idea子窗口裏出現; 2.因此需要設置
JSP中文亂碼問題終極解決方案
在介紹方法之前我們首先應該清楚具體的問題有哪些,筆者在本部落格當中論述的JSP中文亂碼問題有如下幾個方面:頁面亂碼、引數亂碼、表單亂碼、原始檔亂碼。下面來逐一解決其中的亂碼問題。 一、JSP頁面中文亂碼 在JSP頁面中,中文顯示亂碼有兩種情況:一種是HTML中的中文亂碼,另
DoNetZip解壓縮中文檔名亂碼的解決方案
今天踩進了這個坑裡,寫一下省的後面的人掉坑 using (ZipFile zip = new ZipFile(zip_file, Encoding.UTF8)) { zip.Extract
struts2 檔案下載中文亂碼問題解決方案
問題描述:1.前臺jsp頁面通過?傳遞中文引數,action中接收出現亂碼 2.下載檔案時,中文檔案無法顯示。 解決方案:1.在網上查了資料通過在jsp頁面上urlencode可以解決,但是我改為傳遞英文引數,繞開該問題 2.
Linux作業系統下終端亂碼的終極解決方案 export LANG=zh_CN.UTF-8 export LANG=en_US
在使用linux的終端工具SecureCRT的時候,每次提交SVN想輸入中文日誌的時候總是輸不了中文。 svn ci -m "" 這時候兩個引號之間就是沒有辦法輸入中文。 後來跟其他同學請教,找了一個終極解決方案 要先保證SecureCRT是UTF8格式的,設定:選項-會話選項-終端-外觀的字元編碼,選擇u