J2EE方面实现多文件上传比较容易,但是现实多文件的下载,有点麻烦,方法网上讲有几种,我采用的是打包下载,但是在我的项目中,想把查询出来的Ext.grid 数据列表作为excel文件导出,跟每条数据相关的表单文件也一起导出来,为了导出后在查看excel文件时候能够点击文件编号就能打开word文件所以又得处理excel文件。
1.首先是ext下载grid列表到excel文件中。网上能找到很多,如:http://extjs.org.cn/node/324
但是那都只是导出当前页的grid数据,我想导出的是所有的不分页的数据。
if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8 || Ext.isSafari|| Ext.isSafari2 || Ext.isSafari3) {//||Ext.isChrome||Ext.isGecko 支持chrome 和firefox
if (!Ext.fly('frmDummy')) {
var frm = document.createElement('form');
frm.id = 'frmDummy';
frm.name = id;
frm.className = 'x-hidden';
document.body.appendChild(frm);
}
Ext.Ajax.request({
url : this.url, //查询的url
method : 'POST',
form : Ext.fly('frmDummy'),
callback : function(o, s, r) {},
isUpload : true,//这个很重要
params : this.getStore().baseParams //查询的参数
})
} else {
Ext.Msg.alert('操作提示', '不支持该浏览器,请选择IE!');
}
后台接受请求后处理查询出来的list集合。我采用的是poi生成excel文件。生成excel的代码见附件中ExcelUtils.java,
java打zip包,javaAPI中有个包叫java.util.zip用来处理zip打包文件的。但是打包时文件名为中文就会乱码,所以我用truezip.jar。这样就解决了文件名乱码的问题。打包代码见附件ZipUtils.java。
下面是后台处理1:
TYwfl tyw = tywflDAO.findById(mbd.getIntYwid());
if (mbd.getStrChaXun() == null || mbd.getStrChaXun().trim().length() < 0) {
mbd.setStrChaXun("");
}
List<TBd> list_bd = tbdDAO.findByJPQL("select model from TBd model where model.bdZt=12 and( model.tywflBybdYwflid.classId = ? or model.tywflBybdYwflid.parentPath like '" + tyw.getParentPath()
+ "," + mbd.getIntYwid() + ",%' or tywflBybdYwflid.parentId=? ) and model.bdMc like '%" + mbd.getStrChaXun() + "%' order by model.bdId", mbd.getIntYwid(), mbd.getIntYwid());
String basepath = ServletActionContext.getServletContext().getRealPath("soa/");// soa的服务器绝对地址
SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String time = bartDateFormat.format(new Date());
String excelname = basepath + "/tmp/" + tyw.getClassName() + time + ".xls";// excel文件的绝对地址
String zipname = basepath + "/tmp/" + tyw.getClassName() + time + ".zip";// zip文件的绝对地址
String zipcontextpath = "soa/tmp/" + tyw.getClassName() + time + ".zip";// zip文件在服务器上的url下载地址
ExcelUtils excel = new ExcelUtils(excelname);
excel.exportXLS(list_bd);
ZipUtils.outPutZip(basepath, list_bd, zipname, excelname);
setStrFileName(tyw.getClassName() + time + ".zip");
setInputPath(zipcontextpath);
return XIAZAI;
处理2:InPutSream的生成
public InputStream getInputStream() {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);//inputPath是相对服务器的地址,不是本地地址
}
处理3:下载文件名乱码问题
public String getStrFileName() {
try {
strFileName = new String(strFileName.getBytes("gb2312"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// e.printStackTrace();
return "unkown";
}
return strFileName;
}
处理4:配置文件
<result name="xiazai" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${strFileName}"</param>
<param name="bufferSize">4096</param>
</result>