附件统一处理starter,含附件客户端和附件服务端
文章目录
- 附件统一处理starter,可分别作为附件客户端和附件服务端使用
- 一 关于项目中附件的概述
- 二 概要描述
- 三 附件starter功能划分
- 3.1 附件服务器,真实的存储附件
- 3.1.1 为前端提供的接口
- 3.3.2 为附件客户端提供的接口
- 3.2 附件客户端,中转附件状态,依然调用附件服务器的存储
- 四 通用配置说明-前缀统一为attachment
- 附件配置示例
- 五 附件表建表语句
- 六 部分接口简单说明
- 6.1 `一般通用返回JSON格式说明`
- 6.2 为前端提供的接口
- 6.2.1 单文件上传接口
- 6.2.2 多文件上传接口
- 6.2.3 根据id访问一个附件(一般图片)
- 6.2.4 访问一个空附件
- 6.2.5 流下载一个附件
- 6.3 为附件客户端提供的接口(会检验安全码)
- 6.3.1 单文件文件状态修改
- 6.3.2 多文件文件状态修改
附件统一处理starter,可分别作为附件客户端和附件服务端使用
项目地址
文章来源:临窗旋墨的博客
一 关于项目中附件的概述
附件(文件上传)在每一个项目中都是必不可少的。
现在的选择也比较多,可以使用nginx + fastDFS搭建一个轻量级文件存储系统,也可以直接上云上的OSS等;
但是有的时候可能只是单纯写一个小的项目,不一定会使用到这些东西。
所以本人这里写一个简单的附件starter,方便集成到springboot中。
二 概要描述
我的初步的关于附件的构想:
统一管理附件,统一入一个表;
前端异步上传,返回id(和访问地址等)
异步上传的文件入表后,默认的状态为临时的
表单提交的时候,提交的是id或者ids或者是富文本中的完整url(xxxx/xxx/{id})
保存表单的时候根据注解,调用sdk 修改表单实体中附件的状态为持久或临时
定时器清理临时的附件:即上传但是没有使用的附件
附件模块分客户端和服务端模块
主要是作为服务端使用完整的功能, 但是有的时候可能需要几个项目使用一套附件管理系统,
则一套作为服务端配置,
其他作为客户端使用;
作为客户端使用的时候,前端建议直接调用附件服务器的接口,
后台子附件字段入库的时候,通过附件客户端提供的SDK调用服务端修改附件状态
客户端调用服务端附件的时候需简单校验
三 附件starter功能划分
3.1 附件服务器,真实的存储附件
3.1.1 为前端提供的接口
- 异步上传
- 批量异步上传
- 根据id访问单个附件
- 访问一个空附件(当访问一个附件不存在时,重定向到此接口)
- 根据id下载一个附件
3.3.2 为附件客户端提供的接口
- 修改附件状态
- 批量修改附件状态
- 接收附件客户端的文件上传(一般不推荐,应直接前端异步上传)
3.2 附件客户端,中转附件状态,依然调用附件服务器的存储
- 修改附件服务端的附件状态SDK
- 上传附件到服务端的SDK(不推荐)
四 通用配置说明-前缀统一为attachment
是否启用附件功能
enable
默认true当前服务是客户端还是服务端
type
(1-服务端 2-客户端)附件存储的位置
position
服务端专用附件访问的主机
host
:- 根据相对地址访问附件
- 主机+ 相对地址 = 附件访问地址
- 此主机一般使用nginx
附件访问的前缀:
visit
(一般前端使用)- 根据id访问附件
- 附件地址 = 前缀 + /attachment/visit/{id}
空附件的相对位置
broken
,配合3中nginx使用是否启用清除附件定时器:
cleaner
依赖spring的schedule从富文本中提取附件id的正则:
textAttachmentReg
, 默认:String DEFAULT_ATTACHMENT_REG = “/attachment/(download|visit)/(\d+)”";
作为客户端时候配置的服务端的项目地址:
server
用于调用服务端接口是否在启动时检测附件表是否存在
checkTable
作为客户端调用附件服务端时候是检验码:
password
客户端和服务端都需要配置 且一致
附件配置示例
#附件配置attachment作为前缀
# 是否启用附件模块 默认true
attachment.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='附件表';
六 部分接口简单说明
6.1 一般通用返回JSON格式说明
{code:0,//返回码 0-默认 成功msg:"",//错误码说明信息data:null//接口需求的具体数据 或List 或String 等
}
6.2 为前端提供的接口
6.2.1 单文件上传接口
请求地址
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" //上传时间}
}
6.2.2 多文件上传接口
请求地址
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" //上传时间}
}
6.2.3 根据id访问一个附件(一般图片)
请求地址
GET
:/attachment/visit/{id}
URL参数:
参数 | 数据类型 | 必填 | 参数说明 |
---|---|---|---|
id | int | Y | 附件id |
响应结果:
重定向访问的附件,
不存在的时候返回空附件
6.2.4 访问一个空附件
请求地址
GET
:/attachment/visit/null
URL参数:
参数 | 数据类型 | 必填 | 参数说明 |
---|---|---|---|
无 | i |
响应结果:
返回配置的空附件
6.2.5 流下载一个附件
请求地址
GET
:/attachment/download/{id}
URL参数:
参数 | 数据类型 | 必填 | 参数说明 |
---|---|---|---|
id | int | Y | 附件id |
响应结果:
下载附件id对应的文件
6.3 为附件客户端提供的接口(会检验安全码)
6.3.1 单文件文件状态修改
请求地址
POST
/attachment/temporary/update
请求参数:
参数 | 数据类型 | 必填 | 参数说明 |
---|---|---|---|
id | int | Y | 文件id |
temporary | boolean | N | true-临时态,false-持久态 |
错误码说明
code | 错误原因 | 返回消息 |
---|---|---|
响应结果:
{"code": 0,//成功为0 "message":"","data":null
}
6.3.2 多文件文件状态修改
请求地址
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日
附件统一处理starter,含附件客户端和附件服务端相关推荐
- http 缓存分为客户端缓存和服务端缓存
http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...
- 解决android客户端上传图片到服务端时,图片损坏的问题
解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...
- grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用
上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...
- Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息
目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- AjaxPro.NET使用,方便的在客户端直接调用服务端方法
(一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...
- C# 客户端Client与服务端Server通信
C# 客户端Client与服务端Server通信 服务端配置 服务端要先启动,等待客户端请求连接 客户端配置 客户端测试**(切记一定要先开启服务端,不然不能保证连接)**
- PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。
1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...
- oracle 客户端无法连接,Oracle客户端无法连接服务端解决方法及步骤
客户端无法连接服务端数据库,原因有网络,配置,文件访问权限,数据库服务是否已启动 等问题导致,一般排查的步骤如下: 1.检查操作系统级别网络是否通畅 ping 192.168.10.1 2.检查数据库 ...
最新文章
- glog 报错解决: /bin/bash: aclocal-1.14: command not found
- Gartner:2018年十大科技趋势与其对IT和执行的影响
- R语言 scorecard包 评分卡
- Win10桌面右键响应非常慢怎么办?
- 致毕业生:那些年我们错过的“BAT”
- 如何用Pygame写游戏(十九)
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:响应式的列重置
- SpringBoot + Vue 学生管理系统源码(包含数据库文件)
- git工作流学习记录
- 用html实现如下表格完整代码,HTML 表格实现
- for while循环练习
- 利用matlab求解常数e,利用matlab软件求解常数e和欧拉常数γ.docx
- 大数据的预测实力,这15个有趣的数据集,你可能闻所未闻
- 如果考研再来一次,你不会做哪些事情
- UOJ #589. 图图的游戏
- Android正方教务系统课程表+查成绩+查考试安排
- python获取当前系统的日期_Python获取当前日期时间
- c语言程序输入自己班级学号,C语言中设计一个程序就是通过输入学号就能知道班级的程序...
- 《计算广告》第一部分计算广告关键技术——笔记
- OTA本质与实现流程分析
热门文章
- 社交电商+新零售=社交新零售,没思路的创业者看过来
- 论 致命错误c0000005
- 【物联网服务NodeJs-5天学习】第四天存储篇④ ——基于MQTT的环境温度检测,升级存储为mysql
- 嵌入式开发:硬件在环测试
- 【Hackathon】基于RKNPU2给FastDeploy仓库贡献代码
- 通过USB转TTL串口下载stm32程序
- (实战)[re:Invent 2018]-001:赛道分析-(致敬1024)
- Dota2世界冠军OG被AI碾压,全程人类只推掉两座外塔 | 广东省智能创新协会
- 如何同步化本地svn库到googlecode
- sql server 通过参数获取两位数月份