最近写了个功能jqgrid的某个栏位下载文件,本来直接用<a href=""/>直接链接的,但是出现了文件名含中文的就报错的现象,且若文件类型为.txt则直接打开。然后我纠结啊!
然后百度到网上有人使用struts2下载文件解决了这个问题,然后就借用了看看。
jquery代码
 1 function rangFun(value, options, rData){
 2           return '<a href=entCom/download.action?filename='+rData['range_id']+'>'+rData['range_id']+'</a>';
 3      }
 4  $("#externalListGrd").jqGrid({
 5          datatype    : "json",
 6          mtype       : "POST",
 7          width       : 720 ,
 8          height      : 420,
 9          rownumWidth : true,
10          shrinkToFit : false,
11          scroll      : true,
12         ondblClickRow:regectExtFun,
13          colNames    : ['允许范围'],
14          colModel:[
15             { name : 'range_id',   index : 'range_id',   width : 50, align: "left",sortable : "true",formatter:rangFun}]
16    })

struts.xml里的配置
1 <action name="download" class="com.ivo.action.DownloadAction">
2            <result name="success" type="stream">
3               <param name="contentType">text/html,application/vnd.ms-powerpoint,application/vnd.ms-word,application/vnd.ms-excel,text/plain</param> //文件打开方式
4               <param name="inputName">inputStream</param>
5               <param name="contentDisposition">attachment;filename="${filename}"</param>
6               <param name="bufferSize">2048</param>
7            </result>
8         </action>

后台代码
 1 package com.ivo.action;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.InputStream;
 5 import java.io.UnsupportedEncodingException;
 6 
 7 import com.opensymphony.xwork2.ActionSupport;
 8 
 9 public class DownloadAction extends ActionSupport {
10    private String filename;
11    public InputStream getInputStream() throws Exception{
12        String downloadFileName=filename;
13         try {
14             // downloadFileName = new String(downloadFileName.getBytes(),"UTF-8");这样带中文名的文件依旧会报错,想了半天找前辈帮忙看,后来改成下面的才OK。原因是从前台传过来的时候字符已经乱码,所以需要重新解析,再转换
15             downloadFileName = new String(downloadFileName.getBytes("ISO-8859-1"),"UTF-8");
16 
17         } catch(UnsupportedEncodingException e) {
18 
19             e.printStackTrace();
20 
21         }
22        String dir = "D:\\qra\\fileUpload\\"+downloadFileName;
23        return new FileInputStream(dir);
24    }
25 
26     public String getFilename() {
27         return filename;
28     }
29 
30     public void setFilename(String filename) {
31         this.filename = filename;
32     }
33    
34 }