Skip to content

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);
    }