# 文件上传与下载
文件服务包含两部分内容: 上传和下载。
- 文件上传服务的核心接口类是
UploadService。 - 文件下载的服务接口类是
DownloadService。
# 内置的文件服务
DbMeta内置两个文件服务模式mode:
localasoco-oss
# local 模式
本地上传,即上传的文件都将保存在服务端指定目录。其相关的文件服务类为:LocalFileService, 它实现了UploadService和DownloadService。因此
可以实现文件的本地上传和下载,可直接配合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
注意以下两点:
- 为了保证
DbMeta的通用性,后期版本(预计2.4)可能会不再内置支持asoco-oss。不过无需担心,它将出现在额外的jar包中,以供按需引用。 - 当你指定
md.server.upload.mode为local时, 并不以为着你就不能用asoco-oss了(反之也一样),只是意味着dbmeta的内置上传将采用你指定的mode。 但是你自己的业务代码中,比如某个service或controller里,你依然可以通过以下方式采用任意支持的上传服务:FileManager.me().getUploadService("asoco-oss") - 系统一旦上线使用,请固定默认的上传模式
md.server.upload.mode, 比如上线时设置的是local, 一段时间后又改为asoco-oss。那么这段时间上传过的 文件,系统会显示丢失。需要自行从本地存储中转移到asoco oss, 并更改数据库中资源地址。
# 二开扩展
如果你需要扩展支持OSS上传,那么实现UploadService接口,并通过java配置扩展中
的方式进行注册即可。
使用时,指定md.server.upload.mode配置项为你注册时的模式名即可(必须和配置对应的key保持一致)。
借助扩展,你可以很轻松的实现文件阿里云OSS上传支持、七牛云或其他存储方式。 如果上传后返回的url不是可访问的绝对地址,比如需要对其进行鉴权等,那么你需要配套提供
DownloadService, 并且和UploadService打好配合,完成用户的上传下载逻辑。
# 关于上传的其他说明
DbMeta支持一个数据库字段中存储一个文件,或多个文件。如果你希望你的某个数据库字段需要存储文件地址信息,那么你必须满足两个条件:
- 这个字段类型为json或文本类型(varchar、text等)
- 元字段配置中,必须勾选"是否文件"
当你需要在一个字段中存储多个文件时,你必须将这个字段类型设为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无效。
← 鉴权 应用编程的路由和菜单 →