用Struts2解决中文下载问题的时候。发现网上大多数人用的是如下的代码:
(1) struts.xml配置
<action name="fileDownload" class="demo.struts2.action.FileDownload" method="download">
<result name="success" type="stream">
<param name="contentType">"${contentType}"</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
(2) Action中的部分代码:
public String getDownloadFileName()
{
// 省略try/catch
String downFileName = this.fileName;
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
return downFileName;
}
为这里对编码转化这里有些疑惑哦~~
downFileName = new String(downFileName.getBytes(), "ISO8859-1");上面句活的含义不就是把 downFileName 按照本地编码(GBK)输出字节序列,
然后在将其按照 "ISO8859-1" 编码形式,进行“分割”操作。问题就是在这里,如果是这样的话,客户端为什么会自动的把上面的内容(即:下载文件名自动识别出来的呢)
(1) struts.xml配置
<action name="fileDownload" class="demo.struts2.action.FileDownload" method="download">
<result name="success" type="stream">
<param name="contentType">"${contentType}"</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
(2) Action中的部分代码:
public String getDownloadFileName()
{
// 省略try/catch
String downFileName = this.fileName;
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
return downFileName;
}
为这里对编码转化这里有些疑惑哦~~
downFileName = new String(downFileName.getBytes(), "ISO8859-1");上面句活的含义不就是把 downFileName 按照本地编码(GBK)输出字节序列,
然后在将其按照 "ISO8859-1" 编码形式,进行“分割”操作。问题就是在这里,如果是这样的话,客户端为什么会自动的把上面的内容(即:下载文件名自动识别出来的呢)
解决方案 »
- 跪求smarty4j java实例
- 学J2EE要学些什么?
- 创建web项目的时候出现了导包问题
- ==求教:控制台错误提示,===
- tomcat访问静态页面慢问题
- JUnit 4.0 now available 2006-02-16 并高分征求相关实践经验文章与大家共享
- 使用java Socket的方式判断服务器是否与客户端保持连接中碰到的问题!
- 关于log4文件的配置
- eclipse如何编译运行??我晕~!
- struts-config.xml大疑问?(散分!!!)
- apache-cxf-2.1.3自带例子callback的basic_callback.wsdl在myeclipse 6.5工具中报错,请问如何解决?
- 调试错误,请大家帮忙
一个问题已经解决了,一个问题又来了。下面这两条我是在网上查到的:
有时候提供下载的文件名中包含中文字符或者其他unicode字符,会导致浏览器无法正确的采用默认的文件名保存文件。
我们应该记住在响应头中包含filename字段(即 Content-disposition:attachment;filename=xxx)
采用ISO8859-1编码(推荐)或者采用UTF-8编码://(1)采用ISO8859-1编码
response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("UTF-8"),"iso8859-1")); //(2)采用UTF-8编码
response.setHeader("Content-disposition","attachment; filename="+URLEncoder.encode(filename, "UTF-8"));
如果采用第二中方式的话: IE浏览器可以正确的显示出中文名称。但火狐却显示的是URL编码信息。如果采用,第(1)种方法的话,IE无法进行保存操作,而火狐可以正确显示文件名称并可以保存。其实按照我提出的问题: 即: downFileName = new String(downFileName.getBytes(), "ISO8859-1");采用这样的方式,在IE和火狐都可以执行,为什么这样的写法在IE和火狐中都会被正确解释呢?
难道和我的浏览器或系统是默认采用了GBK编码有关?最后:所以我感觉“filename字段”这个东西和浏览器有关系的。据说:在Opera中不管采用那种编码,默认保存的文件名都无法做到正确显示。经过一晚上的测试,我觉得,最好还是把要下载的文件设置成“英文”ascii编码好了。
这样做还是比较保险的。
(但如果存放的是,以utf-8形式进行编码URL编码,则火狐怎么直接会显示URL编码。例如: %E6%AF%9B%E6%B3%BD%E4%B8%9C%E8%AF%AD%E5%BD%95.txt )
而如果filename子都的内容是以urf-8编码的URL编码,则在IE中会将(%E6%AF%9B%E6%B3%BD%E4%B8%9C%E8%AF%AD%E5%BD%95.txt)这个ULR编码正确解释为中文内容。即:“毛泽东语录.txt”。所以我们可以看到,不过是IE还是火狐,如果将filename字段的内容设置为gbk形式的二进制码,则都可以正确显示出来。虽然这样可以满足IE和或两个浏览器,但是我个人还是喜欢URL编码的形式。(虽然在火狐中不会对其URL编码进行解释)
我觉得,在报头里面放入gbk二进制码,感觉很不好~那里面我觉得应该放ISO8859-1形式的编码吧所以我最后还是采用了
//采用UTF-8 URL编码的形式 (虽然火狐会按原样显示)
response.setHeader("Content-disposition","attachment; filename="+URLEncoder.encode(filename, "UTF-8"));
虽然经过了上面的一番自我讨论。但是这个问题仍然没有解决。这个问题就是:为什么把 filename字段的内容设置成为gbk形式的二进制码IE就能正常显示,而将filename字段设置成为utf-8形式的二进制码,IE就无法相应
(但服务器有response)。难道和系统默认编码有关。如果你看了我上面的分析,肯定会想起一句著名的韩国话: “前轱辘转后轱辘不转思密达~”真是车轱辘话,转来转去啊 思密达~~
看来我弄了半天最终还是个浏览器差异的思密达~~我要睡觉拉思密达~拜拜啦~思密达~