[toc]
文章来源:临窗旋墨的博客
附件(文件上传)在每一个项目中都是必不可少的。
现在的选择也比较多,可以使用nginx + fastDFS搭建一个轻量级文件存储系统,也可以直接上云上的OSS等;
但是有的时候可能只是单纯写一个小的项目,不一定会使用到这些东西。
所以本人这里写一个简单的附件starter,方便集成到springboot中。
我的初步的关于附件的构想:
统一管理附件,统一入一个表;
前端异步上传,返回id(和访问地址等)
异步上传的文件入表后,默认的状态为临时的
表单提交的时候,提交的是id或者ids或者是富文本中的完整url(xxxx/xxx/{id})
保存表单的时候根据注解,调用sdk 修改表单实体中附件的状态为持久或临时
定时器清理临时的附件:即上传但是没有使用的附件
附件模块分客户端和服务端模块
主要是作为服务端使用完整的功能, 但是有的时候可能需要几个项目使用一套附件管理系统,
则一套作为服务端配置,
其他作为客户端使用;
作为客户端使用的时候,前端建议直接调用附件服务器的接口,
后台子附件字段入库的时候,通过附件客户端提供的SDK调用服务端修改附件状态
客户端调用服务端附件的时候需简单校验
是否启用附件功能enable 默认true
当前服务是客户端还是服务端 type (1-服务端 2-客户端)
附件存储的位置 position 服务端专用
附件访问的主机 host:
附件访问的前缀:visit(一般前端使用)
空附件的相对位置broken,配合3中nginx使用
是否启用清除附件定时器: cleaner 依赖spring的schedule
从富文本中提取附件id的正则:textAttachmentReg, 默认:
String DEFAULT_ATTACHMENT_REG = “/attachment/(download|visit)/(\d+)\””;
作为客户端时候配置的服务端的项目地址:server 用于调用服务端接口
checkTable password 客户端和服务端都需要配置 且一致
#附件配置attachment作为前缀# 是否启用附件模块 默认trueattachment.enable=true# 当前附件模块的类型,默认1;1-服务端; 2-客户端(只提供修改附件SDK,调用客户端接口修改)attachment.type=1#附件存储位置attachment.position=E:/upload#附件访问主机; url = 主机 + 相对地址,一般是交给nginx处理attachment.host=localhost:10083/attachment/# 附件访问地址:相对于项目; 附件地址 = attachment.visit + /attachment//visit/{id}attachment.visit=http://localhost:81/boot# 附件访问地址:附件服务器项目地址; 附件地址 = attachment.visit + /attachment//visit/{id}attachment.server=http://localhost:81/boot# 空的附件的相对地址 配合attachment.host使用attachment.broken=/test/avatar.jpg#是否开启定时清除临时态附件attachment.cleaner=true# 是否在启动时检测附件表是否存在attachment.checkTable=false#为附件客户端提供的接口的校验密码, 客户端需要和服务端保持一致才能调用接口attachment.password=xasdadxasdasd#附件客户端时的配置 附件服务器项目地址; type=2 时须配置,调用附件接口使用attachment.server=http://localhost:81/boot
CREATE TABLE `attachment` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '附件表id',`absolute_path` varchar(255) DEFAULT NULL COMMENT '绝对地址',`relative_path` varchar(255) DEFAULT NULL COMMENT '相对地址',`temporary` tinyint(1) DEFAULT '0' COMMENT '是否是临时的',`module` varchar(32) DEFAULT NULL COMMENT '所属模块',`content_type` varchar(128) DEFAULT NULL COMMENT 'mimetype',`size` int(11) DEFAULT NULL COMMENT '文件大小',`filename` varchar(128) DEFAULT NULL COMMENT '文件名',`original_name` varchar(128) DEFAULT NULL COMMENT '原文件名',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='附件表';
一般通用返回JSON格式说明
{code:0,//返回码 0-默认 成功msg:"",//错误码说明信息data:null//接口需求的具体数据 或List 或String 等}
请求地址
POST /attachment/upfile
请求参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| upfile | file | Y | 上传的文件 |
| module | String | N | 所属模块 ,根据需要填写 |
错误码说明
| code | 错误原因 | 返回消息 |
|---|---|---|
| 204 | 空文件 | 没有上传任何文件 |
| 500 | 不可预期的异常 | ….. |
响应结果:
{"code": 0,//成功为0"message":"","data": {"id":1,//id"module":"....",//模块"contentType":"image/jpeg","size":10220,/文件大小"url":"",//附件访问地址"originalName" :"",//附件原名"filename":"",//转化后的名称"createTime":"2020-12-12 12:12" //上传时间}}
请求地址
POST /attachment/upfiles
请求参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| upfiles | file数组 | Y | 上传的文件 |
| module | String | N | 所属模块 ,根据需要填写 |
错误码说明
| code | 错误原因 | 返回消息 |
|---|---|---|
| 204 | 空文件 | 没有上传任何文件 |
| 500 | 不可预期的异常 | ….. |
响应结果:
{"code": 0,//成功为0"message":"","data": {"id":1,//id"module":"....",//模块"contentType":"image/jpeg","size":10220,/文件大小"url":"",//附件访问地址"originalName" :"",//附件原名"filename":"",//转化后的名称"createTime":"2020-12-12 12:12" //上传时间}}
请求地址
GET :/attachment/visit/{id}
URL参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| id | int | Y | 附件id |
响应结果:
重定向访问的附件,
不存在的时候返回空附件
请求地址GET :/attachment/visit/null
URL参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| 无 | i |
响应结果:
返回配置的空附件
请求地址GET :/attachment/download/{id}
URL参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| id | int | Y | 附件id |
响应结果:
下载附件id对应的文件
请求地址
POST /attachment/temporary/update
请求参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| id | int | Y | 文件id |
| temporary | boolean | N | true-临时态,false-持久态 |
错误码说明
| code | 错误原因 | 返回消息 |
|---|---|---|
响应结果:
{"code": 0,//成功为0"message":"","data":null}
请求地址POST /attachment/temporary/update
请求参数:
| 参数 | 数据类型 | 必填 | 参数说明 |
|---|---|---|---|
| ids | string | Y | 文件id,形如1-2-3-4 |
| temporary | boolean | N | true-临时态,false-持久态 |
错误码说明
| code | 错误原因 | 返回消息 |
|---|---|---|
响应结果:
{"code": 0,//成功为0"message":"","data":null}
文章来源:临窗旋墨的博客
项目地址:https://gitee.com/lcxm/boot/tree/master/boot-starter-attachment
作者:临窗旋墨 2020年9月21日