struts2中文件下载以及中文乱码

       昨天在试着做一个使用struts2文件下载的功能,基本上没有考虑到乱码的问题,因为当时文件都是以数字进行命名的,下载过程中没有出现问题。

下面给出代码,

Action类,

public class DocDownloadAction extends ActionSupport{
         private String downPath;//下载文件的文件位置
         public InputStream getInputStream(){
        	 //返回InputStream流方法
        	 return ServletActionContext.getServletContext().getResourceAsStream(downPath);
         }
		public String getDownPath() {
			return downPath;
		}
		public void setDownPath(String downPath) {
			this.downPath = downPath;
		}
		//文件名转换编码,防止中文乱码
         public String getDownloadFileName(){
        	 String downFileName = downPath.substring(7);
        	 try {
				downFileName = new String(downFileName.getBytes(),"UTF-8");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	 return downFileName;
         }
         @Override
        public String execute() throws Exception {
             
        	 return SUCCESS;
        }
}
配置,

 <action name="downLoad" class="com.mxl.action.DocDownloadAction">
    <result type="stream"><!-- 指定结果类型为stream类型 -->
       <param name="contentType">           <!-- 指定下载文件的文件类型 -->
       application/msword,text/plain,application/vnd.ms-powerpoint,application/vnd.ms-excel
       </param>
       <param name="inputName">inputStream</param><!-- 指定下载文件的入口输入流 -->
       <param name="contentDisposition">
        attachment;filename="${downloadFileName}"<!-- 指定下载文件的处理方式与文件保存名 -->
       </param>
       <param name="bufferSize">40960</param><!-- 指定下载文件的缓冲区大小 -->
    </result>
   </action>
界面:

 <font style="font-size:12px; color:red">上传者<s:property value="name"/></font>
    <table cellpadding="0" cellspacing="0">
      <tr>
      <th>文件名称</th>
      <th>上传时间</th>
      </tr>
      <s:iterator value="uploadFileName" status="st" var="doc">
      <tr>
       <td><a href="downLoad.action?downPath=upload/<s:property value="#doc"/>"><s:property value="#doc"/></a></td>
       <td><s:date name="createTime" format="yyyy-MM-dd HH:mm:ss"/></td>
      </tr>
      </s:iterator>
    </table>

当时测试的时候因为文件命名没有用到中文,就没有出错,

后来在练习下载权限控制的时候我发现了这个问题,刚开始代码是这样,

  public InputStream getInputStream(){
        	 //返回InputStream流方法
        	 return ServletActionContext.getServletContext().getResourceAsStream(Path);
         }
当文件命名为中文时,文件不能下载,这里边返回值为空,经过测试后发现downPath中的文件名是乱码的,在网上搜了一下好多方法,都试了试,最后在return前边加了一句,

 path = new String(path.getBytes("ISO8859-1"),"utf-8");

解决了我的问题,但是修改后,文件是能够下载了,但是在浏览器中显示的文件名是乱码的,分析以后发现是这里边出的问题,未修改之前的代码,

  public String getDownloadFileName(){
        	 String downFileName = downPath.substring(7);
        	 try {
				downFileName = new String(downFileName.getBytes(),"UTF-8");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	 return downFileName;
         }
我试着将上边的那行代码里边的编码方式交换,

downFileName = new String(downFileName.getBytes("utf-8"),"ISO8859-1");

解决了我的问题,

希望能帮到遇到同样问题的伙伴。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值