1.1. 背景说明
1.1.1. 背景
EPPR-97219 的导出资源到简道云的需求,需要支持文件在【文件导出到服务器】系统选项中新增自定义的文件服务器类型
1.2. 文件管理中心接口
1.2.1. 接口类定义
位置:smartbi.module.export.store.IFileManagerStore
名称:IFileManagerStore
继承自
smartbi.module.export.offline.storer.IOfflineFileStorer
smartbi.module.export.offline.downloader.IOfflineDownloader
1.2.2. 容器类定义
位置:smartbi.module.export.store.IFileManagerStore
名称:IFileManagerFactory
继承情况:无继承、final修饰
功能描述:用于注册IFileManagerStore的实现类
成员变量:Map<String, IFileManagerStore> handlers ,IFileManagerStore实际存储的容器
成员方法说明:
IFileManagerFactory getInstance();
返回IFileManagerFactory单例
void registerFileManagerStoreHandlerIfNotExist(String handlerName, IFileManagerStore handler):注册一个文件系统,handlerName为这IFileManagerStore 对应服务器类型的键名。如果注册时已经存在同名对象,则不进行注册。
void registerEncryptHandlerForce(String handlerName, IFileManagerStore handler):注册一个文件系统,handlerName为这IFileManagerStore 对应服务器类型的键名。如果注册时已经存在同名对象,会覆盖式注册。
IFileManagerStore getEncryptHandler(String handlerName):根据handlerName从handlers 中获取一个对应的文件服务器对象。不存在时返回空。
IFileManagerStore getEncryptHandlerWithError(String handlerName):根据handlerName从handlers 中获取一个对应的文件服务器对象。不存在时抛运行时异常。
public Set<String> getRegistedServerKeys():获取所有注册的键名。
1.2.3. 前端JS改造
在src/web/vision/js/smartbi/spreadsheetreport/ftpsetting/SpreadsheetReportWriteBackFileSettingDialog.js中新增handleBeforeShowUp方法,在“文件存储位置设置”中,在每一条服务器记录被渲染到前端之前,执行此方法可以进行一些前置操作。新增handleBeforeWriteBack方法,在点击保存之后,数据传入后端进行保存之前,执行此方法可以进行一些前置操作。
handleBeforeShowUp(obj,tline)
入参:obj:最终渲染到前端的某一行数据(数组形式);tline:当前这一行的原始数据(数组形式)
返回值:无
handleBeforeWriteBack(obj,ctl)
入参:obj:最终写入知识库的某一行数据(对象形式);ctl:当前这一行的原始数据(数组形式)
返回值:无
在
src/web/vision/js/smartbi/spreadsheetreport/ftpsetting/FTPRemovableGrid.js中新增
handleBeforeTestConnection方法,测试连接前执行的操作,用于复制服务器配置信息。
handleBeforeTestConnection(configObj,currentTableLine)
入参:configObj:服务器配置信息(对象形式);currentTableLine:当前行的原始数据(数组形式)
1.2.4. 接口说明
1.2.4.1. 新增的接口方法
InputStream download(String filename)
功能:处理电子表格单元格格式为“文件”时,点击后触发的下载文件功能
输入:文件名(含后缀)
输出:文件输出流
异常处理:无,实现类内部处理
void initServer(JSONObject serverConfig) throws Exception
功能:初始化服务器相关成员变量
输入:JSONObject对象
备注:调用者会获取系统选项【SPREAD_SHEET_REPORT_WRITEBACK_FILE】中的单个json对象,然后往这个json对象中添加一个“offlineDirectory”键用于记录当前导出的目录,需要注意两个场景:
场景一:在执行产品内置的在线导出、离线导出情况下,这个offlineDirectory为系统选项【OFFLINE_FILE_DIRECTORY】中的值;
场景二:因电子表格单元格回写和单元格格式设置为“文件”格式触发的下载时,这个offlineDirectory为配置“填报属性”时设置的“相对路径”:
以产品内置的“服务器”类型为例,则这个serverConfig的内容示例如下:
{ "name": "111", "addressType": "fileSystem", "address": "E:/temp_csv_xml_files", "account": "server-account", "id": "dialogCB2CE5E473D00001C6CD1E80E7B01FBD", "password": "server-password", "offlineDirectory": "/test", } |
异常:可直接抛异常
boolean testConnection(String address, String account, String password) throws Exception
功能:“文件存储位置设置”中点击“测试连接”时,最终执行的方法
输入: address 服务器地址; account 用户名 ;password 密码(前端输入的明文)
输出:连接成功:true;连接失败:false
异常:可直接抛异常
boolean existFile(String subDirectory, String fileName) throws Exception
功能:使用于电子表格回写上传文件的场景,用于判断文件是否存在
输入:subDirectory:“填报属性”中设置的“相对路径”;fileName:文件名(含后缀)
输出:文件存在:true;文件不存在:false
异常:可直接抛异常
1.2.4.2. 继承而来的接口方法
void download(HttpServletRequest request, HttpServletResponse response, String filename) throws Exception;
功能:在线导出和离线导出时调用,从当前服务器中下载filename文件到HttpServletResponse的输出流
输入:request:请求;response:响应;filename:文件名(含后缀)
继承自:smartbi.module.export.offline.downloader.IOfflineDownloader
异常:可直接抛异常
void download(HttpServletRequest request, HttpServletResponse response, String filename, String downloadName) throws Exception;
功能:在线导出和离线导出时调用,从当前服务器中下载filename文件到HttpServletResonse的输出流并指定文件名为downloadName
输入:request:请求;response:响应;filename:文件名(含后缀);downloadName:下载后的文件名(含后缀)
继承自:smartbi.module.export.offline.downloader.IOfflineDownloader
double getProcess()
功能:获取下载进度,一般在实现时直接返回0.01即可
继承自:smartbi.module.export.offline.downloader.IOfflineDownloader
String getId()
功能:获取文件存储位置id,也就是serverConfig中“id”字段对应的值
继承自:smartbi.module.export.offline.downloader.IOfflineFileStorer
String getDirectory()
功能:获取文件存储目录
返回:文件存储目录
继承自:smartbi.module.export.offline.downloader.IOfflineFileStorer
boolean store(File tempFile)
功能:电子表格回写、离线导出时,上传(保存)文件到服务器中
输入:tempFile:临时文件
输出:上传成功:true;上传失败:false
继承自:smartbi.module.export.offline.downloader.IOfflineFileStorer
boolean unstore(String name)
功能:删除服务器中的文件
输入:name:文件名(含后缀)
输出:删除成功:true;删除失败:false
继承自:smartbi.module.export.offline.downloader.IOfflineFileStorer
void init()
功能:上传文件前调用者会执行的服务器初始化动作,一般用于创建目录
继承自:smartbi.module.export.offline.downloader.IOfflineFileStorer
1.2.4.3. 调用流程
假设现有一个IFileManagerStore iFileManagerStore
1.2.4.3.1. 在线导出、离线导出后的下载
iFileManagerStore.initServer(config); iFileManagerStore.download(request, response, fileName, downloadName); |
1.2.4.3.2. 离线导出导致的上传
iFileManagerStore.initServer(config); // 存储前,会调用init方法 iFileManagerStore.init(); iFileManagerStore.store(request, response, fileName, downloadName); |
1.2.4.3.3. 电子表格单元格格式设置为“文件”时导致的下载
iFileManagerStore.initServer(config); iFileManagerStore.download(filename); |
1.2.4.3.4. 电子表格单元格回写导致的上传
iFileManagerStore.initServer(config); //existFile返回结果仅用于处理最终上传的文件名,不影响后续的下载动作 iFileManagerStore.existFile(subdirectory, fileName); // 存储前,会调用init方法 iFileManagerStore.init(); iFileManagerStore.store(tempFile) |
1.2.4.3.5. 文件删除
iFileManagerStore.initServer(config); // 删除前,需要调用init方法 iFileManagerStore.unstore(filename); |
1.3. 扩展包使用步骤
- 创建类实现IFileManagerStore接口
public class CustomManagerStore implements IFileManagerStore{ } |
- 在Module的activate()方法中注册上述接口实现类,并指定一个String的类型名
IFileManagerFactory.getInstance().registerFileManagerStoreHandlerIfNotExist("MyFileSystem",new JDYFileManagerStore()); |
- 创建
js/smartbi/spreadsheetreport/ftpsetting/SpreadsheetReportWriteBackFileSettingDialog.js.patch处理国际化
SpreadsheetReportWriteBackFileSettingDialog.prototype.getType_SMS_61642 = SpreadsheetReportWriteBackFileSettingDialog.prototype.getType; SpreadsheetReportWriteBackFileSettingDialog.prototype.getType = function(options){ this.getType_SMS_61642(options); //遍历options,将指定键名国际化处理 for(var i=0;i<options.length;i++){ if(options[i].value === "MyFileSystem"){ options[i].text = "自定义文件系统"; options[i].value = "自定义文件系统"; break; } } } SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeWriteBack_SMS_61642 = SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeWriteBack SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeWriteBack = function (obj,ctl) { this.handleBeforeWriteBack_SMS_61642(obj,ctl) if(obj.addressType ==="自定义文件系统"){ obj.addressType ="MyFileSystem"; } } SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeShowUp_SMS_61642 = SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeShowUp SpreadsheetReportWriteBackFileSettingDialog.prototype.handleBeforeShowUp = function (array,tline){ this.handleBeforeShowUp_SMS_61642(array,tline); if(array[1]==="MyFileSystem"){ array[1]="自定义文件系统"; } } |
- 创建js/smartbi/spreadsheetreport/ftpsetting/FTPRemovableGrid.js.patch处理国际化
FTPRemovableGrid.prototype.handleBeforeTestConnection_SMS_61642 = FTPRemovableGrid.prototype.handleBeforeTestConnection FTPRemovableGrid.prototype.handleBeforeTestConnection = function(configObj,currentTableLine){ this.handleBeforeTestConnection_SMS_61642(configObj,currentTableLine); if("自定义文件系统" === configObj.serverType){ configObj.serverType = "MyFileSystem"; } } |
扩展包示例:
View file | ||||
---|---|---|---|---|
|