# 文件上传与下载

文件服务包含两部分内容: 上传和下载。

  • 文件上传服务的核心接口类是UploadService
  • 文件下载的服务接口类是DownloadService

# 内置的文件服务

DbMeta内置两个文件服务模式mode:

  1. local
  2. asoco-oss

# local 模式

本地上传,即上传的文件都将保存在服务端指定目录。其相关的文件服务类为:LocalFileService, 它实现了UploadServiceDownloadService。因此 可以实现文件的本地上传和下载,可直接配合FileBox和ImgBox使用。

local模式,需要应用的配置为:

md:
  server:
    upload: # 上传配置
      mode: local # 默认值local, 可以不配置
      local:
        base-upload-path: /opt/www/db-meta-serve # 当mode为local时有效,配置的本地上传根路径

md.server.upload.mode值为local时,表示采用本地上传,文件在服务器存储路径为md.server.upload.local.base-upload-path配置项指定的值。

WARNING

因此如果你的后端服务是镜像部署,记得务必挂载此路径到宿主机。否则每次重新部署后,容器中的文件会丢失。

事实上,DbMeta不会将文件直接放在md.server.upload.base-upload-path这个路径下,而是会根据文件上传时控件关联的元对象和元字段,进一步 创建目录进行存储。完整的路径如下:

${md.server.upload.base-upload-path}/${objectCode}/${fieldCode}

文件名会追加时间戳,所以不用担心重名覆盖问题。

如果上传时无关联的元对象或元字段,则objectCode和fieldCode会取"anonymous"————表示匿名的意思

# asoco-oss 模式

asoco 基础服务上传,即支持文件上传到asoco 基础服务。其相关的文件服务类为:AsocoOssUploadService, 它实现了UploadService,但未实现DownloadService。因此 可以实现文件的本地上传, 但无法下载(也无需下载,因为上传asoco oss后返回的url为可直接访问的绝对地址)。

上传到asoco oss中。其配置项为:

md:
  server:
    upload: # 上传配置
      mode: asoco-oss # 开启asoco oss上传
      asoco-oss: # 当mode为asoco-oss时有效
        basic-service-url: https://api.asoco.com.cn # 基础服务地址
        upload-path: /oss/upload # 基础服务上传接口path, 默认为此值,可不提供
        bucket-name: db-metadata-demo # 一般设为应用的英文名,注意和其他应用名避免冲突

md.server.upload.mode值为asoco-oss时,表示采用AsocoOssUploadService服务。上传的文件将被转储到asoco oss中。因此,你必须配置 asoco-oss下的几个配置项。含义见注释。

WARNING

注意以下两点:

  1. 为了保证DbMeta的通用性,后期版本(预计2.4)可能会不再内置支持asoco-oss。不过无需担心,它将出现在额外的jar包中,以供按需引用。
  2. 当你指定md.server.upload.modelocal时, 并不以为着你就不能用asoco-oss了(反之也一样),只是意味着dbmeta的内置上传将采用你指定的mode。 但是你自己的业务代码中,比如某个service或controller里,你依然可以通过以下方式采用任意支持的上传服务: FileManager.me().getUploadService("asoco-oss")
  3. 系统一旦上线使用,请固定默认的上传模式md.server.upload.mode, 比如上线时设置的是local, 一段时间后又改为asoco-oss。那么这段时间上传过的 文件,系统会显示丢失。需要自行从本地存储中转移到asoco oss, 并更改数据库中资源地址。

# 二开扩展

如果你需要扩展支持OSS上传,那么实现UploadService接口,并通过java配置扩展中 的方式进行注册即可。

使用时,指定md.server.upload.mode配置项为你注册时的模式名即可(必须和配置对应的key保持一致)。

借助扩展,你可以很轻松的实现文件阿里云OSS上传支持、七牛云或其他存储方式。 如果上传后返回的url不是可访问的绝对地址,比如需要对其进行鉴权等,那么你需要配套提供DownloadService, 并且和UploadService打好配合,完成用户的上传下载逻辑。

# 关于上传的其他说明

DbMeta支持一个数据库字段中存储一个文件,或多个文件。如果你希望你的某个数据库字段需要存储文件地址信息,那么你必须满足两个条件:

  1. 这个字段类型为json或文本类型(varchar、text等)
  2. 元字段配置中,必须勾选"是否文件"

当你需要在一个字段中存储多个文件时,你必须将这个字段类型设为json,dbmeta会将文件存储为json数组的形式。格式如下:

[{
	"url": "",
	"name": "",
    "seat": "" // 如果是seat模式,还会有seat项
}]

如果字段是字符串类型,那么DbMeta只会将url存储进去。

# 关于上传控件(FileBox/ImgBox)的seat模式

先说下这样一个场景: 比如数据库表里我有一个证件字段: certificate, 我希望可以传两个证件,因此我设置了字段类型为json。

但是,我还需要明确json数组中,哪一项表示什么含义,比如第一个证件是身份证正面,第二个是反面。那么此时你就需要使用seat模式了。 seat模式的开启取决于FileBox/ImgBox 组件配置项中的seats。它是一个字符串数组, 如果数组长度为0,则表示是默认模式(json值中 不会存储seat信息)。

如果字符串长度为2,则上传控件会产生两个上传位置,并且将seats中的内容作为"铭牌"标注在控件合适的位置。此时, json值中就会存储seat信息。

正式的会议中,贴心的助理都会往每个位置上放一个铭牌,"一个萝卜一个坑"。seat模式就是这个含义。

注意: seat模式下,上传控件配置中的limit无效。

关于上传控件配置的更多内容,参见ImgBoxFileBox

Last Updated: 5/17/2022, 1:33:44 PM