首页 > 代码库 > springmvc文件下载之文件名下划线问题终极解决方案
springmvc文件下载之文件名下划线问题终极解决方案
直接上代码:Action中代码片段。
@RequestMapping("download")
public String download(ModelMap model, @ModelAttribute("e") Template t, HttpServletResponse response, HttpServletRequest request) throws Exception {
Account acc = getLoginAccount();
if(acc==null || StringUtils.isBlank(acc.getAccount())){
return ("/account/login");
}
String fileUrl = template.getFileUrl(); //url 路径, 如 http://×××××/×××/××××/image/20170525/中文.jpg
String filename = fileUrl.substring(fileUrl.lastIndexOf("/")+1); //截取最后的文件名 -> 中文.jpg
filename = processFileName( request, filename);
BufferedOutputStream bf = null;
try {
response.setHeader("Content-disposition", "attachment; filename = " + filename);
bf = new BufferedOutputStream(response.getOutputStream());
bf.write(this.httpConverBytes(fileUrl,request));
}....
重要的 processFileName方法。
public static String processFileName(HttpServletRequest request, String fileNames) {
String codedfilename = null;
try {
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf("MSIE") || null != agent
&& -1 != agent.indexOf("Trident")) {// ie
String name = java.net.URLEncoder.encode(fileNames, "UTF8");
codedfilename = name;
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
codedfilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
}
} catch (Exception e) {
e.printStackTrace();
}
return codedfilename;
}
//httpConverBytes 方法
public static byte[] httpConverBytes(String path,HttpServletRequest request) {
BufferedInputStream in = null;
ByteArrayOutputStream out = null;
URLConnection conn = null;
int httpResult=0;
try {
StringBuffer sb = new StringBuffer();
for(int i=0;i<path.length();i++){
char a=path.charAt(i); //url路径的中文部分重新编码 很重要
if(a>127){//将中文UTF-8编码
sb.append(URLEncoder.encode(String.valueOf(a), "utf-8"));
}else{
sb.append(String.valueOf(a));
}
}
URL url = new URL(sb.toString()); //创建URL
URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码urlconn.connect();
HttpURLConnection httpconn = (HttpURLConnection) urlconn;
httpResult = httpconn.getResponseCode();
in = new BufferedInputStream(httpconn.getInputStream());
if (httpResult != HttpURLConnection.HTTP_OK){ //不等于HTTP_OK说明连接不成功
System.out.print("连接失败!");
}else {
out = new ByteArrayOutputStream(1024);
byte[] temp = new byte[1024];
int size = 0;
while ((size = in.read(temp)) != -1) {
out.write(temp, 0, size);
}
byte[] content = out.toByteArray();
return content;
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
通过以上处理下划线问题解决了。
springmvc文件下载之文件名下划线问题终极解决方案
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。