乱码原因:超链接中含有中文参数,提交到后台会乱码;
解决思路:将这个参数转成 unicode 编码,再传到后台,到后台再将参数解析成中文。
前台:
//文件路径
var path = 'E:/cathy_jcy/default_upload_dir/excel/付款申请_20170426.xlsx';
var pathArrayStr = path.split("/");
path = path.substring(0,path.lastIndexOf("/"));//path = 'E:/cathy_jcy/default_upload_dir/excel'
//文件名转成unicode编码
var fileName = cathy.encodeUnicode(pathArrayStr[pathArrayStr.length-1]);
//连接拼接
var url = "localhost:8080/xxx/downFileController/download?filePath="+path+"&fileName="+fileName;
/**中文转Unicode**/
cathy.encodeUnicode = function (str) {
var res = [];
for ( var i=0; i<str.length; i++ ) {
res[i] = ( "00" + str.charCodeAt(i).toString(16) ).slice(-4);
}
return "\\u" + res.join("\\u");
}
后台:
/**
* 下载文件
* @param request
* @param response
*/
@RequestMapping(value = "/download", method = RequestMethod.GET)
@ResponseBody
public String download(HttpServletRequest request,HttpServletResponse response) {
String filePath = request.getParameter("filePath");
String urlFileName = request.getParameter("fileName");
String path = filePath;
path = path+"/"+this.convertUnicode(urlFileName);//将文件名解析成中文后拼接文件路径
// 以流的形式下载文件。
File file = new File(path);
try {
// 清空response
response.reset();
// 设置response的Header
String fileName = file.getName();
String agent = (String)req.getHeader("USER-AGENT");
if(agent != null && agent.indexOf("Firefox") != -1) {
// firefox
fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
}else{
// others
fileName = URLEncoder.encode(file.getName(), "UTF-8");
}
response.addHeader("Content-Disposition", "attachment;filename="+ fileName);
response.addHeader("Content-Length", ""+ file.length());
response.setContentType("application/octet-stream");
InputStream inputStream = new BufferedInputStream(new FileInputStream(path));
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
int length = -1;
byte[] buffer = new byte[1024 * 1024];
while((length = inputStream.read(buffer)) != -1) {
// 读入流, 保存在buffer数组中
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
convertUnicode 方法:
/**
* Unicode 转中文
* @param Unicode
*/
public String convertUnicode(String Unicode){
char aChar;
int len = Unicode.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;) {
aChar = Unicode.charAt(x++);
if (aChar == '\\') {
aChar = Unicode.charAt(x++);
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = Unicode.charAt(x++);
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
value = (value << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
outBuffer.append((char) value);
} else {
if (aChar == 't')
aChar = '\t';
else if (aChar == 'r')
aChar = '\r';
else if (aChar == 'n')
aChar = '\n';
else if (aChar == 'f')
aChar = '\f';
outBuffer.append(aChar);
}
} else
outBuffer.append(aChar);
}
return outBuffer.toString();
}