**2020/06/24更新
问题终于解决了!开心!谢谢帮助过我的大侠们!
其实问题不在BASE64Encoder方法中。第一步获取文件名的时候,就出现了乱码,所以后面找不到文件才出错的。
//1.获取请求参数,文件名
String filename = request.getParameter("filename");
原因是server.xml的编码方式设置不对。改成UTF-8就能正常传递中文了。
<Connector URIEncoding="UTF-8"ectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
**
跪求大神帮忙!!!
做文件下载的练习,用了BASE64Encoder对文件名进行编码,但是文件名仍然是乱码。
代码如下:
package cn.itcast.web.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
public class encodeFileName {
/**
* deal with the fileName encode in the different browsers
* @param request
* @param fileName
* @return
* @throws UnsupportedEncodingException
*/
public static String getFileName(String agent, String filename)
throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
//IE浏览器
filename = URLEncoder.encode(filename,"utf-8");
filename = filename.replace("+", " ");
}else if (agent.contains("Firefox")) {
//火狐浏览器
BASE64Encoder base64Encode = new BASE64Encoder();
filename = "=?utf-8?B?"+base64Encode.encode(filename.getBytes("utf-8"))+"?=";
}else {
//其他浏览器
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}
}
文件下载的servlet部分代码如下:
//1.获取请求参数,文件名
String filename = request.getParameter("filename");
//解决中文文件问题
//获取客户端浏览器的版本
String agent = request.getHeader("user-agent");
System.out.println(agent);
filename = encodeFileName.getFileName(agent,filename);
System.out.println(filename);
//2.使用字节码,加载进内存
//2.1找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/"+filename);
System.out.println(realPath);
//2.2调用字节流,加载进内存
FileInputStream fis = new FileInputStream(realPath);
控制台打印出文件名:=?utf-8?B?57yH5bqh44KzLmpwZw==?=
realPath:null
感觉就是对中文编码没有起到效果,不知道问题出在哪里了?网上查找了很多方法,写法都跟我这个一样,为什么就是没有效果?
跪求大神帮忙啊!!谢谢!!
追加:
网上很多例子,servlet部分的代码里,//解决中文文件问题的代码,是写在response.setHeader("content-disposition", "attachment;filename="+filename);这个之前的。所以我把servlet的代码改成如下:
//1.获取请求参数,文件名
String filename = request.getParameter("filename");
//2.使用字节码,加载进内存
//2.1找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/"+filename);
System.out.println(realPath);
//2.2调用字节流,加载进内存
FileInputStream fis = new FileInputStream(realPath);
//3。设置response响应头
//3.1设置响应头类型:content-type
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type", mimeType);
//解决中文文件问题
//获取客户端浏览器的版本
String agent = request.getHeader("user-agent");
System.out.println(agent);
filename = encodeFileName.getFileName(agent,filename);
System.out.println(filename);
//3.2设置响应头打开方式:content-dispositon
response.setHeader("content-disposition", "attachment;filename="+filename);
如上的代码,在2.2部分,就报了空指针异常了,为什么啊?已经搞了半天了,实在是搞不懂了!!!