文件(files)

版本

sie-snest-file-v2.0.0.RELEASE.jar

能力介绍

文件上传功能、excel导入导出功能等

使用教程

1、添加配置

application.properties 配置文件添加以下配置

#minio
minio.endpoint=http://192.168.175.54:9000
minio.accessKey=snest
minio.secretKey=12345678
minio.bucketName=apps

2、添加file APP

在项目路径的apps目录下添加sie-snest-file-v2.0.0.RELEASE.jar项目包

基础接口介绍

引擎提供了文件上传/file/upload接口。

文件上传接口

请求方式 POST
请求地址 /file/upload
请求参数1 file
请求参数2 userId

文件预览接口

请求方式 GET
请求地址 /file/preview
请求参数 id

文件下载接口

请求方式 POST/GET
请求地址 /file/download
请求参数1 id
请求头 Authorization

文件上传自定义

请求方式 POST
请求地址 /file/uploadForModel
请求参数1 model_id
请求参数2 user_id

导入导出(excel)

1.基础用法模型导入导出

rbac_role继承base_excel模型,拥有了export,Import两个服务。所以只需要配置视图就可以直接访问导入导出功能。如果默认服务不支持你的需求,当然我们也支持自定义导入导出服务,自己编写服务,详情请看高阶用法。

@SDK.Model(name = "rbac_role", type = Buss, displayName = "角色", parent = "base_excel")
public class Role extends Model {
    
}
1.1 tbar视图配置导出(export)
 {
     "name": "导出",
     "action": "export",
     "properties": ["name","code","is_admin","remark"],
     "model": "rbac_role",
     "service": "export"
 }
1.2 tbar视图配置导入(Import)
{
    "name":"导入",
    "action": "import",
    "model": "rbac_role",
    "service": "Import",
    "fileLimit": {
        "ext": ".xls,.xlsx",
        "maxSize": "2048"
    }
}

2.高阶用法服务自定义

自定义export,Import服务。需要自己定制化导入导出可以重写这两个服务,或者可以自己命名服务名。

@MethodService(description = "Excel导出")
  public void export(RecordSet rs, Filter filter, List<String> properties, Integer limit, Integer offset, String order) {
      Meta meta = rs.getMeta();

      Map<String, List<Map<String, Object>>> datas = new LinkedHashMap<>();

      RecordSet rs1 = meta.get(meta.getModelName());
      if (Objects.isNull(rs1)) {
          throw new ExceException(String.format("文件导出异常,RecordSet %s 空", meta.getModelName()));
      }

      List<Map<String, Object>> values = rs1.search(filter, properties, limit, offset, order);

      ModelMeta modelMeta = rs1.getModel();
      if (Objects.isNull(modelMeta)) {
          throw new ExceException(String.format("文件导出异常,modelMeta %s 空", meta.getModelName()));
      }

      List<Map<String, Object>> newValues = new ArrayList<>();
      for (Map<String, Object> value : values) {
          Map<String, Object> newV = new LinkedHashMap<>();
          for (String p : properties) {
              PropertyMeta propertyMeta = modelMeta.getProperty(p);
              if (!Objects.isNull(propertyMeta)) {
                  Object v = value.getOrDefault(p, "");
                  newV.put(propertyMeta.getDisplayName(), v);
              }
          }
          newValues.add(newV);
      }


      String modelName = StringUtils.isNotBlank(modelMeta.getDisplayName()) ? modelMeta.getDisplayName() : modelMeta.getName();
      datas.put(modelName, newValues);


      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
      String fileName = modelName + "_" + dateFormat.format(new Date());
      String suffix = ".xlsx";

      rs.getMeta().get("base_excel").call("fileExport", datas, fileName + suffix);

  }


  @MethodService(description = "Excel导入")
  public boolean Import(RecordSet rs, String fileId) {
      Meta meta = rs.getMeta();

      RecordSet rs1 = meta.get(meta.getModelName());
      if (Objects.isNull(rs1)) {
          throw new ExceException(String.format("文件导入异常,RecordSet %s 空", meta.getModelName()));
      }

      ModelMeta modelMeta = rs1.getModel();
      if (Objects.isNull(modelMeta)) {
          throw new ExceException(String.format("文件导入异常,modelMeta %s 空", meta.getModelName()));
      }

      String modelName = StringUtils.isNotBlank(modelMeta.getDisplayName()) ? modelMeta.getDisplayName() : modelMeta.getName();

      Map<String, List<Map<String, Object>>> fileMap = (Map<String, List<Map<String, Object>>>) rs.getMeta().get(
              "base_excel").call("fileImport", fileId);

      List<Map<String, Object>> sheet1 = fileMap.get(modelName);
      for (Map<String, Object> s : sheet1) {

          Map<String, Object> mV = new LinkedHashMap<>();
          for (Map.Entry<String, Object> v : s.entrySet()) {
              PropertyMeta propertyMeta = modelMeta.getProperties().stream().filter(p -> p.getDisplayName().equals(v.getKey())).findFirst().orElse(null);
              if (!Objects.isNull(propertyMeta)) {
                  mV.put(propertyMeta.getName(), v.getValue());
              }
          }

          rs.create(mV);
      }
      return true;
  }

自定义excelExport视图文件

 {
     "name": "导出",
     "action": "export",
     "properties": ["name","code","is_admin","remark"],
     "model": "rbac_role",
     "service": "export"
 }

自定义excelImport视图文件

{
    "name":"导入",
    "action": "import",
    "model": "rbac_role",
    "service": "Import",
    "fileLimit": {
        "ext": ".xls,.xlsx",
        "maxSize": "2048"
    }
}

3. 名词解释

属性 定义
action 事件用于前端支持按钮类型,import导入按钮,export导出按钮。
service 服务名,就是MethodService标注的方法。
name 中文名称
fileLimit 文件上传限制,文件大小,格式类型。
model 模型名
properties 指定需要导出的属性名

文件(file)

文件后端上传

      FileInputStream fileInputStream;
              try {
                      fileInputStream = new FileInputStream(new File("D:\\gitlab\\sie-snest-dev\\sie-snest-apps\\snest-apps\\mom\\target\\mom-1.0-SNAPSHOT.jar"));
                      Map<String, Object> upload = (Map<String, Object>) recordSet.getMeta().get("meta_attachment").call("putObject", fileInputStream,"mom-1.0-SNAPSHOT.jar","apps");
                  System.out.println(upload);
              } catch (FileNotFoundException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              }

文件后端上传备注

若上传的文件流来自于URL,那么需要读取并转成ByteArrayInputStream

URLConnection connection = new URL(url).openConnection();
InputStream inputStream = connection.getInputStream();
byte[] bytes = streamToByteArray(inputStream);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
Map<String, Object> upload = (Map<String, Object>) myMeta.get("meta_attachment").call("putObject", byteArrayInputStream, originalFilename, "apps");
public static byte[] streamToByteArray(InputStream in) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[4096];
    int n;
    while (-1 != (n = in.read(buffer))) {
        output.write(buffer, 0, n);
    }
    return output.toByteArray();
}

获取文件流

String fileId = "meta_attacment 的 id";
InputStream is = rs.get("base_file").call("getInputStream", fileId);