这周做练习的时候主要是通过“单位新登记”模块来学习文件上传、下载以及导出到EXCEL,下面对这三个部分分别做一下总结。
1.文件上传
1.1 业务背景: 现要对所有格式的文件进行上传,上传的方式有web和fpt两种,由于我现在只用了web方式,ftp方式等实践了之后进行追加。
1.2 代码实现: doUpload()函数里面的url调用了核三框架里面的Action,该Action返回了framework/uploadAttachment_i.jsp
页面,应当注意到文件对应的表为FW_COMM_ATTACHMENT,里面有一个BAE007(业务流水号)字段,因此在进行文件操作时应该先开启流程(ProcessService.startWf()),返回业务流水号,再进行文件上传的操作。
<a name="upload" class="commBtn" style="width: 80px;" onclick="dwglBtn.doUpload()">上传文件</a>
//doUpload()函数部分代码:
var paramStr ="ywlsh="+mini.get("ywlsh").getValue()+"&uploadType=" + GVAR.FILE_UPLOAD_TYPE + "&uploadPath=/upload";
// 弹出文件上传窗口
var options = {
url: GVAR.contextPath + '/framework/web/uploadattach.do?' + paramStr,//请求URL
title: "上传文件", //标题
width: 500, //宽度
height: 300, //高度
allowResize: false, //允许尺寸调节
allowDrag: true, //允许拖拽位置
showCloseButton: true, //显示关闭按钮
showMaxButton: false, //显示最大化按钮
showModal: true, //显示遮罩
loadOnRefresh: false, //true每次刷新都激发onload事件
ondestroy: function(action) { //关闭弹窗时刷新电子材料列表
dwglBtn.queryFile();
}
}
var win = mini.open(options);
win.show('center', 'middle');
//文件窗口代码
<form id="uploadForm" method="post" action="${ctx}/CommUpload.do" ENCTYPE="multipart/form-data">
<table style="margin-left: 10%; width: 90%;">
<tr>
<td><label>选择文件:</label><input type="file" name="idFileList" id="idFileList" style="width: 80%;"></td>
</tr>
</table>
<input type="hidden" name="configId" value="" />
<%--CommonSave需要的参数--%>
<input type="hidden" name="_rtnURL"
value="<%=_rtnUrl %>" />
<input type="hidden" name="_redirect" value="false">
<input type="hidden" name="_commDo" value="<%=uploadService%>" />
<input type="hidden" name="_uploadFile" value="true" />
<input type="hidden" name="_uploadType" value="<%=uploadType%>" />
<input type="hidden" name="_uploadPath" value="<%=uploadPath%>" />
<input type="hidden" name="ywlsh" value="<%=ywlsh%>" />
<input type="hidden" name="wjlx" value="" />
</form>
<button id="qrsc" onclick="qrsc()" class="commBtn" style="margin-top: 50px;">确认上传</button>
2.文件下载
2.1 前台JS
downloadRow:function(id){
var url = GVAR.contextPath + "/downFile.do?serviceId=commFileDownloadService&ZLID=" + id;
window.location.href = url;
},
2.2 Service层: 新建一个文件处理的Service,该Service继承IExportService,Override重写exportFile()方法。
web下载方式存在的问题:点击文件下载标签后,无论是否下载,本地的文件都会被删除,导致再次下载的时候出错。
public class CommFileDownloadService implements IExportService{
/** 文件上传路径 */
static final String FILE_DIR = "web" + File.separator + "hnisiDownload" + File.separator + "upload";
/** 项目根目录 */
private static final String PROJECT_DIR = "web";
private static final String USERNAME = ConfUtil.getParam("COMM_FTPUSER");
private static final String PASSWORD = ConfUtil.getParam("COMM_FTPPWD");
private static final String DESTPATH = ConfUtil.getParam("COMM_FTPDIR");
private static final String FTPSERVER = ConfUtil.getParam("COMM_FTPIP");
private static final String FTPPORT = ConfUtil.getParam("COMM_FTPPORT", "21");
/** 公共的DAO */
CommDAO commDAO = (CommDAO) Util.getBean("commDAO");
@Override
public File exportFile(IDTO dto) throws AppException {
/** 要下载的文件id */
String ZLID = (String) dto.getValue("ZLID");
Map<String,Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("ZLID", ZLID);
Map<String, Object> wjxx = commDAO.selectOne("DWGL.SELECT_WJXX", paramsMap);
if ("web".equals(wjxx.get("UPLOADTYPE"))) {
String filePath = this.getClass().getClassLoader().getResource("/").getPath().replace("/", File.separator);
filePath = filePath.substring(0, filePath.indexOf(PROJECT_DIR)) + FILE_DIR + File.separator + wjxx.get("BAE007") + File.separator;
return new File(filePath + wjxx.get("FILENAME"));
} else if ("ftp".equals(wjxx.get("UPLOADTYPE"))) {
FtpClientUtil ftpClientUtil =new FtpClientUtil(FTPSERVER, FTPPORT, USERNAME, PASSWORD);
return ftpClientUtil.downFile(DESTPATH + wjxx.get("BAE007"), (String)wjxx.get("FILENAME"));
} else {
throw new AppException("未找到匹配的上传文件类型");
}
}
}
3.导出EXCEL
3.1 前台
<form id="reportForm" name="reportForm" action="${ctx}/downFile.do" method="post">
<%--指定FW_IMPEXP_EXCEL的配置ID --%>
<input type="hidden" name="configId" value="DWDJ_EXPORT">
<%--指定调用服务的名称,如果自定义报表,这里改成具体的服务ID --%>
<input type="hidden" name="serviceId" value="excelService">
<%--指定调用服务的行数,如果自定义报表,这里改成具体的函数名 --%>
<input type="hidden" name="method" value="exportFile">
<%--报表的离散数据查询条件,可以定义多条这样的查询条件,而且声明顺序比较与配置中定义的一致 --%>
<input type="hidden" name="hashWhereCls" value="1=1">
<%--报表的列表查询条件,可以定义多条这样的查询条件,而且声明顺序比较与配置中定义的一致 --%>
<input type="hidden" id="WhereCls" name="listWhereCls" class="mini-hidden">
<%--配置动态字典额外参数 ,如果没有动态字典,可以不传,如果需要配置动态字典,那么需要传入一个合法
的object格式的JOSN字符串,object的属性是动态字典id,属性值是查询条件--%>
<input type="hidden" name="dynDictWhereCls" value="">
<%--DTO参数调整值,value中指定的名称,在中间层始终会以数组形式组织或者为空,
本例子指明listWhereCls这个值可能有多个,必须使用以数组形式组织--%>
<input type="hidden" name="_multiple" value="listWhereCls,hashWhereCls">
<%--页面的其它参数,可能service中会用到 --%>
<input type="hidden" name="JBR" value="">
</form>
//JS
/**
* 导出
*/
doExport: function() {
reportForm.submit();
},
3.2 查询条件 WhereCls示例:查询条件:单位编号…等
var WhereCls="1 = 1 and WF_PROCESS_INSTANCE.BAE007 = ys_dwjbzl.BAE007 ";
if(mini.get("DWBH").getValue()!=""){
WhereCls=WhereCls+"and DWBH LIKE '%"+mini.get("DWBH").getValue()+"%'";
}
if(mini.get("DWMC").getValue()!=""){
WhereCls=WhereCls+"and DWMC LIKE '%"+mini.get("DWMC").getValue()+"%'";
}
if(mini.get("XTJGDM").getValue()!=""){
WhereCls=WhereCls+"and XTJGDM LIKE '%"+mini.get("XTJGDM").getValue()+"%'";
}
if(mini.get("SHJG").getValue()!=""){
WhereCls=WhereCls+"and SHJG = "+mini.get("SHJG").getValue()+" ";
}
if(mini.get("BLSJC").getValue()!=""){
WhereCls=WhereCls+"and SHJBSJ >= to_date('"+mini.get("BLSJC").getFormValue()+"','yyyy-MM-dd')";
}
if(mini.get("BLSJZ").getValue()!=""){
WhereCls=WhereCls+"and SHJBSJ <= to_date('"+mini.get("BLSJZ").getFormValue()+"','yyyy-MM-dd')";
}
//设置 reportForm中的查询条件;
mini.get("WhereCls").setValue(WhereCls);
3.3 导出脚本配置
--申报项目统计导出
delete from fw_impexp where id = 'DWXX_EXPORT';
insert into fw_impexp (ID, SQLSTR, TEMPLATEFILE, DICTINFO, HASHSQLSTR)
values ('XMSBTJ_EXPORT',
/*配置语句,配置语句列的前后顺序必须与多记录表中对于列表的列定义的前后顺序一致,多个列表sql之间用“$”符合分隔,多个列表sql按顺序对应列表0、列表1……列表N
相关表名及字段请替换为实际业务的表名及字段
*/
'sql语句',
/*Excel导出模板*/
'DWXX_EXPORT.xls',
--配置字典,字典的配置方法参考多记录表的字典配置
'DWLX=DWLX',
/*配置离散数据(注:离散数据的字段名对应Excel模板中离散数据定义的名称),多个离散数据sql之间用“$”符合分隔
相关表名及字段请替换为实际业务的表名及字段
*/
'SELECT TO_CHAR(SYSDATE, ''YYYY'') || ''信息化建设项目清单'' BBMC FROM DUAL');
commit;
3.4 EXCEL配置
配置好名称管理器,列表数据对应列表0,列表1….,离散数据字段名跟名称管理器相同