這周做練習的時候主要是通過“單位新登記”模塊來學習文件上傳、下載以及導出到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….,離散數據字段名跟名稱管理器相同