最近做了一个文件下载的需求,但是下载的文件名称如果是中文名,下载后出现名称无法显示的问题。查看资料后最终解决了。
原因:
因为用post方式提交的,所以用Servlet做的,设置的头信息里面需要对文件名称做处理,Header中只支持ASCII,传输的文件名必须是ASCII(为什么只支持ASCII)否则当出现中文名文件时,就出现异常。
Tips:
只是针对header!!!
代码如下:
public void downLoad(String fileName, String filePath,HttpServletResponse response) throws IOException {
// 设置response参数,可以打开下载页面 application/msword
response.reset();
// application/force-download
// multipart/form-data
// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
response.setContentType("application/force-download");
// 支持中文名称文件,需要对header进行单独设置,不然下载的文件名会出现乱码或者无法显示的情况
// String downloadFileName = new String(fileName .getBytes(), "ISO-8859-1");
String downloadFileName = URLEncoder.encode(fileName,"UTF-8");
// 设置响应头,控制浏览器下载该文件
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
//通过文件路径获得File对象
File file = new File(filePath + fileName);
FileInputStream inputStream = null;
OutputStream out = null;
try {
inputStream = new FileInputStream(file);
//通过response获取ServletOutputStream对象(out)
out = response.getOutputStream();
int length = 0;
byte[] buffer = new byte[1024];
while ((length = inputStream.read(buffer)) != -1){
//4.写到输出流(out)中
out.write(buffer,0,length);
}
} catch (IOException e) {
e.printStackTrace();
log.info("file is error" + e.getMessage());
} finally {
inputStream.close();
out.flush();
out.close();
}
}
这两种方式都可以,
String downloadFileName = URLEncoder.encode(fileName,"UTF-8");
String downloadFileName = new String(fileName .getBytes(), "ISO-8859-1");
encode要用utf-8是因为:
ISO-8859-1为什么可以