问题:
本地文件部署到服务器上时,如果文件的名字为中文,虽然文件能够从浏览器下载,但是文件的名字解析不出来。
如:我要下载一个名字为球员的图片
<a href="/Response/downLoad1?filename=球员.jpg">中文名称图片下载</a>
解决措施:
1.获取客户端使用的浏览器版本信息
2.根据不同的浏览器版本信息,设置filename的编码格式不同
public class DownLoadeUtilis {
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 base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
接口中,在获取文件名之前,先解析文件名。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数,文件名称
String fileName =request.getParameter("filename");
System.out.println(fileName); //photo
//2.使用字节流,加载文件进内存
//2.1找到文件所在的服务器路径
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath("/img/" + fileName);//图片的真是路径
//2.2使用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//自己理解为,通过此步骤,可以获取从浏览器把文件保存到本地的权限
//3.设置response响应头
//3.1设置响应头的数据类型:content-type //因为我们也不知道文件的类型,所以需要设置。
String mimeType = servletContext.getMimeType(fileName);
response.setHeader("content-type",mimeType);
//3.1.1解决中文文件名问题
//获取user-agent请求头
String agent = request.getHeader("user-agent");
String fileName1 = DownLoadeUtilis.getFileName(agent, fileName);
//3.2设置响应头的打开方式
response.setHeader("content-disposition","attachment;filename="+fileName);//filename设置的为下载提示框的名字
//4.将输入流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024*8];
int len = 0;
while ((len=fis.read(buff))!=-1){
sos.write(buff,0,len);
}
fis.close();//输入流关闭
}