用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.   

    楼主说的是string的构造方法吧具体的看看jdk的api吧  呵呵 
      

  2.   


    一个问题已经解决了,一个问题又来了。下面这两条我是在网上查到的:
    有时候提供下载的文件名中包含中文字符或者其他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编码好了。
    这样做还是比较保险的。
      

  3.   

    所以我们可以看到如果是火狐浏览器,不管filename字段存放的是utf-8二进制码,还是gbk二进制码,火狐都能够识别出来。(不像IE只能识别出来 gbk二进制码与utf-8形式的URL编码)
    (但如果存放的是,以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)。难道和系统默认编码有关。如果你看了我上面的分析,肯定会想起一句著名的韩国话: “前轱辘转后轱辘不转思密达~”真是车轱辘话,转来转去啊 思密达~~
    看来我弄了半天最终还是个浏览器差异的思密达~~我要睡觉拉思密达~拜拜啦~思密达~
      

  4.   

    上面说的二进制码是以ISO8859-1为依托的二进制码