Appearance
1、获取文件信息的接口
参数说明
- 入参参数由以下3部分组成:
1、关联业务字段:前端代码配置的joinTable
2、服务器信息:前端代码配置的severCode
3、前端自定义的的param:配置在前端由各自业务自己赋值的字段部分
- 入参参数格式:
json
{
"joinTable": "GG_CLQD",--关联的业务表名字
"serverCode": "",--服务器编码
"...params": ""--自定义提供的参数
}
- 出参参数格式:
json
[
{
--上传的时候带上这个值,如果这个值没有提供,则获取前端配置的(具体的值有由业务自己指定)
"joinTable":"",
--上传的时候带上这个值(具体的值有由业务自己指定,如果是内网则是GG_CLQD_ID)
"joinId":"",
--上传的文件服务器位置编码,这条记录记录对应使上传文件的时会
--提供这个则取获取文件信息,没有提供则会给前端配置的
"serverCode":""
--材料清单的其他前端要配置展示的字段
"...clqd":"",
"fileList": [
{
--文件id,删除预览的时候时候用,固定叫id,如果后端字段刚好不叫id,
--可以写一个 getId(){return this.getGgClqdId}
"id": "71481acf2761448fb740e50be118ef88",
"fullName": "ASP.NET 代码生成器源码学习.pdf",
"fileSize": "0",
"fileType": ".pdf",
"url": "test/20220721\\0879a49a-b116-416f-9a24-22acc47ef313.pdf",
"creatorTime": "1658387914000"
}
],
--jnpf框架的校验信息,即base_files_group表记录,如果没有给null即可
"fileGroupEntity": {
"id": "0357a439e51b41cfa16162f7ee0a7c62",
"sortCode": null,
"enabledMark": 1,
"creatorTime": 1652862663000,
"creatorUser": "admin",
"lastModifyTime": 1653355982000,
"lastModifyUser": "admin",
"deleteMark": null,
"deleteTime": null,
"deleteUserId": null,
"name": "group-test1",
"required": 1,
"max": 2,
"min": 1,
"fileSize": 10,
"fileType": "_.pdf",
"typeCode": "biz-type_01"
}
}
]
以下是构造上面json格式的2个例子
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadKuangJiaController.java
/**
* 获取数据信息
*
* @param model 这个模型类每个业务不一样,
接收可各自去实现UploadInfoModel只是demo,具体的接收各自去写
* @return
*/
@ApiOperation("获取数据信息")
@GetMapping
public ActionResult<List<GgClqdEntity>> info(UploadInfoModel model)
throws DataException {
//目前前端配置的serverCode对应的值是BASE_BIZ_TYPE表的F_BIZ_TYPE值
//model.getServerCode()刚好等于材料类型编码的值,
// ServerCode=BASE_BIZ_TYPE的F_BIZ_TYPE字段=材料类型编码
//(注意是有的业务会才等于材料类型编码,我这边只是按是的时候写的demo)
List<GgClqdEntity> clqdList=ggClqdService
.findDataList(model.getBzmGgSl(),Integer.parseInt(model.getServerCode()));
//编辑
if (clqdList!=null&&clqdList.size() > 0) {
clqdList.forEach(item -> {
//1、附件记录
List<FileListEntity> fileList = fileListService
.findListByTableId(item.getBzmGgClqd());
item.setFileList(fileList);
//因为前端只能配置1个值,当出现后端返回的列表来源于多个表组装
//起来的记录就不适用,所以加了也可以由后端指定,例如第一层数组表有多个
//,例如gg_clqd,hj_clqd等来源多个表,前端只能配置一个不适用,
//所以就由各自的列表自己提供,这边例子是只有个gg_clqd表可给可不给
//如果是后端赋值,可以参考内网的GgClqdEntity模型类
//,覆写模型类的get方法改变返回值
// item.setJoinId();
//item.setJoinTable();
//即BASE_BIZ_TYPE表的F_BIZ_TYPE值
//2、受理材料(如果不想写死1,想用前配的配置的公共的也可以)
item.setServerCode(model.getServerCode());
//提供可由后端自己写的目的是当接口不止有gg_clqd还有其他表的时候
//,会优先获取这个值
// ,如果获取不到,则会获取前端配置的(大部分是一个父表,前端配置即可)
//item.setServerCode("1");
if(!StringUtil.isEmpty(item.getBzmZdsjCl())){
ZdsjClEntity zdsjClEntity=zdsjClService
.getInfo(item.getBzmZdsjCl());
//目前ZdsjClEntity还没添加T_FILES_GROUP_ID字段,
//各自业务真的用到的时候自己补上字段
//item.setFileGroupEntity(
//fileGroupService.getInfo(zdsjClEntity.getfileGroupId()));
}
});
} else {
//新增
clqdList=this.findClToGgClqd(model.getBzmGgSl());
}
return ActionResult.success(clqdList);
}
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadYwController.java
public ActionResult<List<GgClqdEntity>> info(UploadInfoModel model)
throws DataException {
List<GgClqdEntity> clqdList = ggClqdService
.findDataList(model.getBzmGgSl(), Integer.parseInt(model.getCllx()));
if (clqdList != null) {
clqdList.forEach(item -> {
List<GgClqdFjEntity> clqdFjList= ggClqdFjService
.findDataList(item.getBzmGgClqd());
item.setFileList(clqdFjList);
//这个值有2种情况
//1、如果这边给了值,在上传接口的的时候会给拿着这个值传到上传接口
//2、如果这个给了空值,在上传接口的时候会取前端代码配置的
//serverCode给到上传接口
//这个为了方便测试,后端给了值在
item.setServerCode("1");
//这边如果是非框架的获取不到校验,可以不用管他,默认就是null,
//这边写的目的是为了方便解释有个字段的存在
item.setFileGroupEntity(null);
//因为前端只能配置1个值,当出现后端返回的列表来源于多个表组装
//起来的记录就不适用,所以加了也可以由后端指定,例如第一层数组表有多个
//,例如gg_clqd,hj_clqd等来源多个表,前端只能配置一个不适用,
//所以就由各自的列表自己提供,这边例子是只有个gg_clqd表可给可不给
//如果是后端赋值,可以参考内网的GgClqdEntity模型类
//,覆写模型类的get方法改变返回值
// item.setJoinId();
//item.setJoinTable();
});
}
return ActionResult.success(clqdList);
}
2.上传(请求格式post)
参数说明
- 入参参数由以下4部分组成:
1、文件信息:切片的文件fileId,文件名字fileName
2、前端自定义的的param:配置在前端由各自业务自己赋值的字段部分
3、服务器信息:文件列表或者配置的severCode,优先传获取文件信息的接口提供的,没有则传前端代码配置的(因为信息记录如果返回多条,每条下的文件存放目录可能不一样,所以才支持也可以由后端配置到具体目录)
4、关联业务字段:附件绑定业务的joinId,joinTable优先给后端列表给的,没有给字段或者空值则给前端配置的
- 入参参数格式:
json
{
"fileId": "123",--切片文件id
"fileName": "a.pdf",--文件名字
"joinTable": "GG_CLQD",--关联的业务表名字
"joinId": "124",-关联的业务表id
"serverCode": "",--服务器编码
"...params": ""--自定义提供的参数
}
- Controller层强制继承:
必须继uploadFileBaseController.java,前端控件上传过程会调用3个方法 ,前2个方法是所有的都公共的,不能自己去实现,继承下面这个这个类
- 参考代码:
1、遇到完全由自己实现,不是调用封装的上传控件时
应用场景:当用户点击导出xx模板.xls,需要存稿备份到smb时
java
https://www.ztgis.com:2443/svn/java项目代码_框架B/trunk/
code_unit/code/back/ztgis-java-boot/ztgis-back-core/
ztgis-file/src/main/java/ztgis/utils/SmbFileUtil.java
/**
* SMB
*
* @param urlModel 上传的文件存放服务器的信息
* @param localFile 待存放的文件
*/
public static void uploadFile(UrlConfigModel urlModel, File localFile) {
...
}
2、调用的封装的上传控件 ,服务器信息与文件记录信息的情况
说明:上传的需要1、存放在那个服务器(2.1框架统一获取、2.2业务自己获取)2、文件记录保存到那张表(2.3框架表base_files、2.4业务表) 居于上面的情况,可以两两组合
2.1、由公共获取服务器信息
java
//提供baseSysConfigKey,bizTypeId,bizType中的任意一个值
//由公共根据值统一获取
FileCodeModel fileCodeModel=new FileCodeModel();
fileCodeModel.setBizType(model.getServerCode());
2.2、业务自己获取服务器信息,可以从json文件,表,或者代码写死等任何途径能获取到就可以
java
/**
*
*这边的目的是表示各自业务实现的要自己写,从json,或者写死,或者来源于数据库等等
* 这个只是举例子可以从json来,其他的可以自定义
* 通过serveCode 获取附件配置信息
* @param serverCode 服务器code
* @param dir 业务存储路径(下载和删除不会使用到可以任意给,上传时可以为空,
* 不为空的就是业务第一层文件夹)(注意:如果是测绘信息外网,
这个方法已经在工具类里存在,可以查看测绘信息外网代码或者问文俊)
* @return
* @throws IOException
*/
public UrlConfigModel getUrlConfigModel(String serverCode,String dir)
throws IOException {
//读取json文件,json内容({"wwWorkFile":{"storageProtocol":"SMB"
//,"config":{"url":"172.16.112.92/fileserver"
//,"username":"smbuser","password":"1","httpUrl":""}})
String configFilePath = configValueUtil.getSysConfigPath()+"server.json";
JSONObject jsonObject = JSONObject.parseObject(
FileUtils.readFileToString(new File(configFilePath), Constants.UTF_8));
JSONObject configJo = jsonObject.getJSONObject(serverCode)
.getJSONObject("config");
//转换为指定的统一格式
UrlConfigModel urlConfigModel = new UrlConfigModel();
urlConfigModel.setStorageProtocol(jsonObject.
getJSONObject(serverCode).getString("storageProtocol"));
urlConfigModel.setUsername(configJo.getString("username"));
urlConfigModel.setPassword(configJo.getString("password"));
urlConfigModel.setUrl(configJo.getString("url"));
urlConfigModel.setFolderPath(dir);
return urlConfigModel;
}
2.3、由公共组装框架表base_files记录的相关字段值,虽然框架表, 各别字段还是业务自己赋值,实现方式会通过回调出去业务自己赋值
java
Consumer<FileListEntity> fileListFun=(fileListEntity)->{
//这个根据自己业务自己看值来源,这边只是表示一下这个值需要自己填写
fileListEntity.setDataSource("4");
};
2.4、完全由业务自己赋值文件记录,如下是那gg_clqd_fj举例子
java
Function<FileBizInfo,Boolean> fileInfo=(m)->{
GgClqdFjEntity ggClqdFjEntity=new GgClqdFjEntity();
ggClqdFjEntity.setBzmGgClqd(model.getJoinId());
ggClqdFjEntity.setWjcflj(m.getUrl());
ggClqdFjEntity.setWjcfmc(m.getSaveFileName());
ggClqdFjEntity.setWjdx(m.getFileSize());
ggClqdFjEntity.setWjhzm(m.getSuffixName());
ggClqdFjEntity.setWjscmc(model.getFileName());
ggClqdFjEntity.setWjscsj(new Date());
ggClqdFjService.create(ggClqdFjEntity);
return true;
};
3、基于上面的情况,举例组合后的样子
3.1、 2.1的公共获取服务器信息和2.3的框架表组合的情况
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadKuangJiaController.java
/**
* 切片合并
*
* @return
*/
@NoDataSourceBind()
@ApiOperation("切片合并")
@PostMapping(value = "/chunk-all")
@MoreTransaction({"master","slave1"})
public ActionResult chunkAll(UploadParaModel model) {
// 1、切片文件路径( 自定义的相对路径,如果给空会自动生成当天的yyyyMMdd日期)
String relativePath="";
//2、获取服务器的信息(提供baseSysConfigKey,bizTypeId,bizType(对应上面2.1的)
//中的任意一个值)
FileCodeModel fileCodeModel=new FileCodeModel();
fileCodeModel.setBizType(model.getServerCode());
//3、业务信息回调(对应上面的2.3)
Consumer<FileListEntity> fileListFun=(fileListEntity)->{
//这个根据自己业务自己看值来源,这边只是表示一下这个值需要自己填写
fileListEntity.setDataSource("4");
};
fileApiUtil.uploadFile(model,relativePath,fileCodeModel,fileListFun);
return ActionResult.success();
}
3.2、 2.2的业务自己获取服务器信息和2.4业务表记录的组合
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadYwController.java
/**
* 切片合并
*
* @return
*/
@NoDataSourceBind()
@ApiOperation("切片合并")
@PostMapping(value = "/chunk-all")
@MoreTransaction({"master","slave1"})
public ActionResult chunkAll(UploadParaModel model) {
// 1、切片文件路径( 自定义的相对路径,如果给空会自动生成当天的yyyyMMdd日期)
String relativePath="";
//2、获取服务器的信息
FileCodeModel fileCodeModel=new FileCodeModel();
fileCodeModel.setBizType(model.getServerCode());
//3、业务信息回调(对应上面的2.2)
UrlConfigModel urlConfigModel=
this.getUrlConfigFromJson(model.getServerCode(),"/test");
//保存数据库记录(对应上目的2.4)
Function<FileBizInfo,Boolean> fileInfo=(m)->{
GgClqdFjEntity ggClqdFjEntity=new GgClqdFjEntity();
ggClqdFjEntity.setBzmGgClqd(model.getJoinId());
ggClqdFjEntity.setWjcflj(m.getUrl());
ggClqdFjEntity.setWjcfmc(m.getSaveFileName());
ggClqdFjEntity.setWjdx(m.getFileSize());
ggClqdFjEntity.setWjhzm(m.getSuffixName());
ggClqdFjEntity.setWjscmc(model.getFileName());
ggClqdFjEntity.setWjscsj(new Date());
ggClqdFjService.create(ggClqdFjEntity);
return true;
};
fileApiUtil.uploadFile(model,urlConfigModel,fileInfo);
return ActionResult.success();
}
3.3、其他组合可以查看如下路径,里面将4种组合都写了例子 https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/ back/ztgis-biz-modules/chxx/src/main/java/ztgis/ biz/controller/uploaddemo/UploadZhController.java
3.删除
参数说明
- 入参信息:文件记录id,joinTable,文件服务器信息serverCode
- 接收方式: @DeleteMapping("/{id}")
- 参数格式: id的值:A文件记录id|joinTable|serverCode,B文件记录id|joinTable|serverCode
- 参考代码:
1、当前端不是调用封装上传ui控件,删除完全有自己实现,可调用如下文件的如下方法:
java
https://www.ztgis.com:2443/svn/java项目代码_框架B/trunk/
code_unit/code/back/ztgis-java-boot/ztgis-back-core/
ztgis-file/src/main/java/ztgis/utils/FileOperateUtil.java
/**
* 该方法只负责删除物理文件,不负责删除记录,记录由各自业务自己删除
* @param urlConfigModel 文件的服务器地址信息与文件路径,
具体需传哪些字段可以查看模型类字段注释
*/
public void delFile(UrlConfigModel urlConfigModel) throws Exception {
//物理盘存放
if (FileConstant.STORAGE_PROTOCOL_DAS
.equals(urlConfigModel.getStorageProtocol())){
String deleteFilePath =urlConfigModel.getUrl()
+ "/" + urlConfigModel.getFilePath();
File f = new File(deleteFilePath);
f.delete();
}
//smb存放
else if(FileConstant.STORAGE_PROTOCOL_SMB
.equals(urlConfigModel.getStorageProtocol())){
SmbFileUtil.deleteSmbFile(urlConfigModel);
}
}
2、调用的封装的上传控件 框架实现自己获取服务器信息
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadKuangJiaController.java
/**
* 删除文件记录这种必须BASE_FILES的F_BIZ_TYPE_ID值存在
*
* @param id 格式:文件id|表名|serverCode
*
* @return
*/
@ApiOperation("删除记录")
@DeleteMapping("/{id}")
public ActionResult delete(@PathVariable("id") String id) throws Exception {
return fileApiUtil.del(id)?
ActionResult.success("删除成功"):ActionResult.fail("删除失败,数据不存在");
}
业务自己获取服务器信息
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadYwController.java
/**
* 删除文件记录,服务器信息和记录由各自业务自己操作的情况
* @param id 格式:文件id|表名|serverCode
* 如果表名没有提供则由各自业务自己去获取文件服务器
* @return
*/
@ApiOperation("删除记录")
@DeleteMapping("/{id}")
public ActionResult delete(@PathVariable("id") String id) throws Exception {
//获取文件服务器信息,目的是由公共删除文件
Function<FileOpInfoModel, UrlConfigModel> urlFun=(m)->{
GgClqdFjEntity ggClqdFjEntity=ggClqdFjService.getInfo(m.getFileId());
UrlConfigModel urlConfigModel=
this.getUrlConfigFromJson(m.getServerCode(),"");
//文件的相对路径,删除的时候用,不然无法删除
urlConfigModel.setFilePath(ggClqdFjEntity.getWjcflj());
return urlConfigModel;
};
//删除记录
Function<FileOpInfoModel, Boolean> delRecordFun=(m)->{
//这里是走物理删除记录,还是逻辑删除记录,
//由各自业务自己确定,这里表达的意思删除由业务自己来
GgClqdFjEntity ggClqdFjEntity=ggClqdFjService.getInfo(m.getFileId());
ggClqdFjService.delete(ggClqdFjEntity);
return true;
};
return fileApiUtil.del(id,urlFun,delRecordFun)?
ActionResult.success("删除成功"):ActionResult.fail("删除失败,数据不存在");
}
4.下载
参数说明
- 入参信息:文件记录id,joinTable,文件服务器信息serverCode
- 接收方式: @GetMapping("/Download/{fileId}")
- 参数格式: fileId的值:A文件记录id|joinTable|serverCode,B文件记录id|joinTable|serverCode
- 参考代码:
1、当前端不是调用封装上传ui控件,下载完全有自己实现,可调用如下文件的如下方法:
java
https://www.ztgis.com:2443/svn/java项目代码_框架B/trunk/
code_unit/code/back/ztgis-java-boot/ztgis-back-core/
ztgis-file/src/main/java/ztgis/utils/FileOperateUtil.java
/**
* 只适用于list都是同一协议的,要么都是smb,要么都是das
* @param list 要下载的文件的路径和服务器相关信息
*/
public void downFile(List<UrlConfigModel> list) throws FileNotFoundException {
if (list == null || list.isEmpty()) {
return;
}
if (list.size() == 1) {
this.downOneFile(list.get(0));
} else {
this.downManyFile(list.get(0).getStorageProtocol(), null, list);
}
}
2、调用的封装的上传控件
框架实现自己获取服务器信息
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadKuangJiaController.java
/**
* 获取下载文件链接,这种必须BASE_FILES的F_BIZ_TYPE_ID值存在
* @param fileId 格式:文件1id|表名|serverCode,文件2id|表名|serverCode
* @return
*/
@NoDataSourceBind()
@ApiOperation("获取下载文件链接")
@GetMapping("/Download/{fileId}")
public void downloadUrl(@PathVariable("fileId") String fileId)
throws FileNotFoundException {
fileApiUtil.downLoadFile(fileId);
}
业务自己获取服务器信息
java
https://www.ztgis.com:2443/svn/厦门市自然资源调查测绘信息平台/01 CODE/hjdc/
back/ztgis-biz-modules/chxx/src/main/java/ztgis/
biz/controller/uploaddemo/FileUploadYwController.java
/**
* 获取文件路径,服务器信息和记录由各自业务自己操作的情况
*格式,文件1id|表名|serverCode,文件2id|表名|serverCode
* @return
*/
@NoDataSourceBind()
@ApiOperation("获取下载文件链接")
@GetMapping("/Download/{fileId}")
public void downloadUrl(@PathVariable("fileId") String fileId)
throws FileNotFoundException {
//回调业务自己获取服务器信息
Function<FileOpInfoModel, UrlConfigModel> urlFun=(m)->{
UrlConfigModel urlConfigModel=
this.getUrlConfigFromJson(m.getServerCode(),"");
GgClqdFjEntity ggClqdFjEntity=ggClqdFjService.getInfo(m.getFileId());
//文件下载的相对路径,下载的时候用
urlConfigModel.setFilePath(ggClqdFjEntity.getWjcflj());
return urlConfigModel;
};
fileApiUtil.downLoadFile(fileId,urlFun);
}