在前面一篇日志:理解和灵活应用 Struts2 的文件下载功能 还留下一个问题,在 Servlet 中支持文件下载功能时,客户保存下载文件所用的字符集总是 ANSI(ISO8859-1),如何能设定客户保存文件用的字符集呢?像 BlogJava 的备份数据功能下载后就是用的 UTF-8 字符集的。自己作了一些尝试,总是无济于事,看如下代码是 Servlet 的 doGet() 方法:
1 2 3 4 5 6 7 8 9 10 11 12 |
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // PrintWriter out = response.getWriter(); PrintWriter out = new PrintWriter(new OutputStreamWriter(response .getOutputStream(), "UTF-8")); response.setContentType("text/plain;charset=UTF-8"); response.setHeader("Content-Disposition","attachment;filename=down.txt"); out.write("Servlet download file test"); out.close(); } |
访问这个 Servlet 时会提示下载文件 down.txt,保存之后用记事本打开,另存它时看到的是 ANSI 编码,或用 EditPlus 打开右下角显示的是 ANSI。然而要是把上面的 "attachment" 改为 "inline",内容为在线打开,同时右键里看到的却是地地道道的 UTF-8,保存文件却不行。不知道这里各位达人们有无这方面的经验、或是高见,能让下载文件以 UTF-8 编码保存,还望不吝赐教。
本文链接 https://yanbin.blog/servlet-download-encoding/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
更改服务器编码试了吗?
在doGet方法的第一句调用 response.setCharacterEncoding("utf-8") 试试。
试过,也是这样子的。
<%
OutputStream os=response.getOutputStream();
RequestContext reqContext = (RequestContext)request.getAttribute("reqContext");
Document inDom = null;
inDom = reqContext.getDocument();
response.reset();
response.setContentType("application/vnd.ms-excel");
String fileName = XmlUtil.getNodeValue(inDom.getElementsByTagName("fileName").item(0));
response.setHeader("content-disposition","attachment; filename="+URLEncoder.encode(fileName,"UTF-8"));
String templateName = XmlUtil.getNodeValue(inDom.getElementsByTagName("templateName").item(0));
String path = request.getRealPath("/") + "/WEB-INF/classes/templates/"+templateName;
XLSTransformerExt transformer = new XLSTransformerExt();
Map map = DynaBeanUtil.createDynaMap(inDom.getFirstChild().getFirstChild());
transformer.transformXLS(path, map, os);
os.flush();
out = pageContext.pushBody();
response.flushBuffer();
out.clear();
if(os!=null) {
os.close();
os = null;
}
%>
谢谢楼上的回复,我一定会试一下的。
以前老哥帮过我,现在至少尽点苦力!
经过无数次测试,发现一个很怪的地方!
首先,老哥的代码没有任何问题(整个流程),惟一发现的一个地方是:
out.write("Servlet download file test");
我发现字符串内容为中文或者在"Servlet download file test"的末尾通过输入法工具 (我用的是搜狗)加上一个!标记(除开标准字母)后,再下载的话,格式就是UTF-8的了。我在这方面很弱,所以只能说测试出来的,也不知道什么道理!