针对“在Firefox/IE下Response中文文件名乱码问题解决方案”的完整攻略如下:
问题描述
在FireFox和IE中进行下载时,如果响应(Response)中的文件名是中文的话,可能会出现文件名乱码的问题。这是因为Firefox和IE对于Response的编码方式不一样导致的。
解决方案
我们需要在服务器端设置HTTP响应(Response)头信息,告知浏览器使用UTF-8编码方式解析中文文件名,这样就能够避免中文文件名乱码的问题了。具体的设置方式如下:
设置Content-Disposition头部
response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8") );
其中,fileName为文件名,可以是中文,URLEncoder.encode函数对文件名进行了UTF-8编码,而 "filename*=UTF-8''" 则是规定了文件名的编码方式,固定为UTF-8。
这种方式是根据RFC 6266标准而来,其中的filename*=UTF-8''是协商机制中的一种方式,其大致意思是:若想使用RFC 5987协议,那么浏览器必须支持,否则就按照普通的方式处理,即先采用浏览器默认编码方式解析,若无法解析再采用UTF-8编码方式。
设置Content-Type头部
另外,我们也可以设置Content-Type头信息,指定HTTP响应的所对应的MIME类型为 application/octet-stream 或 application/vnd.ms-excel,这样也能够解决这个问题。
response.setContentType("application/octet-stream;charset=UTF-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
示例说明
以Java Web项目为例进行说明:
//设置响应头信息,防止中文乱码
response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8") );
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//文件输出流
OutputStream out = response.getOutputStream();
//读取文件
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while(i != -1) {
out.write(buffer,0,i);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) bis.close();
if (fis != null) fis.close();
if (out != null) out.close();
}
这段代码会通过response对象将文件传输给前端用户。其中,设置Content-Disposition头信息和Content-Type头信息即可解决中文文件名乱码的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在FireFox/IE下Response中文文件名乱码问题解决方案 - Python技术站