Struts2 文件下载及中文乱码问题的解决方案

Java代码 收藏代码
  1. 一struts.xml文件的编辑
  2. <struts>
  3. <packagename="crud-default"extends="convention-default">
  4. <actionname="download"class="com.myweb.download.DownLoadAction">
  5. <!--type为stream应用StreamResult处理-->
  6. <resultname="success"type="stream">
  7. <!--默认为text/plain-->
  8. <paramname="contentType">application/x-msdownload;charset=ISO8859-1</param>
  9. <!--默认就是inputStream,它将会指示StreamResult通过inputName属性值的getter方法,
  10. 比如这里就是getInputStream()来获取下载文件的内容,意味着你的Action要有这个方法-->
  11. <paramname="inputName">inputStream</param>
  12. <!--默认为inline(在线打开),设置为attachment将会告诉浏览器下载该文件,filename
  13. 指定下载文件时的文件名,若未指定将会是以浏览的页面名作为文件名,如以download.action作为文件名-->
  14. <paramname="contentDisposition">attachment;filename="${fileName}"</param>
  15. <!--输出时缓冲区的大小-->
  16. <paramname="bufferSize">4096</param>
  17. </result>
  18. </action>
  19. </package>
  20. </struts>
  21. 二,com.myweb.download.DownLoadAction的文件的代码
  22. publicclassDownLoadActionextendsActionBase{
  23. privateLoggerlogger=LoggerFactory.getLogger(DownLoadAction.class);
  24. privateStringfileName=null;
  25. publicStringexecute()throwsException{
  26. return"success";
  27. }
  28. publicInputStreamgetInputStream(){
  29. this.fileName=json.substring(json.lastIndexOf("\\")+1,json.length());
  30. returnStruts2Utils.getSession().getServletContext().getResourceAsStream(json);
  31. }
  32. publicStringgetFileName(){
  33. try{
  34. Struts2Utils.getResponse().setHeader("charset","ISO8859-1");
  35. returnnewString(this.fileName.getBytes(),"ISO8859-1");
  36. }catch(UnsupportedEncodingExceptione){
  37. return"获取文件名出现了错误!";
  38. }
  39. }
  40. }

遇到的问题:

文件可以下载,但是在websphere环境下,下载的文件的中文名是乱码,解决问题的步骤如下:
第一,修改了struts.xml文件



Struts2 文件下载及中文乱码问题的解决方案_第1张图片




第二,修改了DownLoadAction.java文件的getFileName方法
Java代码 收藏代码
  1. publicStringgetFileName(){
  2. try{
  3. returnnewString(this.fileName.getBytes(),"ISO8859-1");
  4. }catch(UnsupportedEncodingExceptione){
  5. return"获取文件名出现了错误!";
  6. }
  7. }

在新弹出IE窗口中,第一次下载时,下载提示框中文仍然是乱码, 再次下载,就可以正常显示中文。整个应用软件包
的默认编码是UTF-8, 在第一次下载之后,客户端浏览器的默认编码被修改为ISO8859-1,再次下载中文就可以正常
显示,因为这时候IE浏览器的字符集编码是西欧ISO

Struts2 文件下载及中文乱码问题的解决方案_第2张图片

如上图所示,浏览器的默认编码从UTF-8修改为西欧ISO
那我们又该如何解决这个第一次下载时出现乱码的问题呢?

第三,继续修改DownLoadAction.java文件的getFileName方法

public String getFileName() {
try {


//在服务器端通过设置http Header, 设置了客户端的默认的字符集编码

Struts2Utils.getResponse().setHeader("charset","ISO8859-1");

return new String(this.fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
return "获取文件名出现了错误!";
}
}

附: 如果整体修改为UTF-8下载反而会出现"未知的文件名"的错误提示,http请求中默认的编码有可能是ISO8859-1

你可能感兴趣的:(struts2)