云盘项目框架结构
注册、登录、...、上传文件在程序启动之初会分别为它们创建一个进程进行业务处理。
数据库设计
数据库用来存放文件信息和用户信息,含有下面几个表:
file_info 表
该表保存一个文件的存储信息,下面是file_info表的详细内容:
CREATE TABLE `file_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文件序号,自动递增,主键',
`md5` varchar(256) NOT NULL COMMENT '文件md5',
`file_id` varchar(256) NOT NULL COMMENT '文件id:/group1/M00/00/00/xxx.png',
`url` varchar(512) NOT NULL COMMENT '文件url 192.168.52.139:80/group1/M00/00/00/xxx.png',
`size` bigint(20) DEFAULT '0' COMMENT '文件大小, 以字节为单位',
`type` varchar(32) DEFAULT '' COMMENT '文件类型: png, zip, mp4……',
`count` int(11) DEFAULT '0' COMMENT '文件引用计数,默认为1。每增加一个用户拥有此文件,此计数器+1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COMMENT='文件信息表';
- md5:文件的 md5 值,文件上传先可以先匹对数据库是否存在相同的 md5 值,如果存在意 味着是同一文件。
- file_id:文件 id,对应 fastdfs 的文件路径
- url:文件的完整存储路径,比如 192.168.52.139:80/group1/M00/00/00/xxx.png
- count:文件引用计数,每增加一个用户拥有此文件,此计数器+1
share_file_list 表
该表保存一个文件的共享信息,下面是share_file_info表的详细内容:
CREATE TABLE `share_file_list` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`user` varchar(32) NOT NULL COMMENT '文件所属用户',
`md5` varchar(256) NOT NULL COMMENT '文件md5',
`file_name` varchar(128) DEFAULT NULL COMMENT '文件名字',
`pv` int(11) DEFAULT '1' COMMENT '文件下载量,默认值为1,下载一次加1',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件共享时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='共享文件列表';
- user:文件所属用户
- md5:文件对应的 md5 值
- file_name:文件名
- pv:文件下载量
user_file_count 表
该表记录每个用户拥有的文件数量,下面是user_file_info表的详细内容:
CREATE TABLE `user_file_count` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(128) NOT NULL COMMENT '文件所属用户',
`count` int(11) DEFAULT NULL COMMENT '拥有文件的数量',
PRIMARY KEY (`id`),
UNIQUE KEY `user_UNIQUE` (`user`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='用户文件数量表';
- user:用户名
- count:文件数量
user_file_list 表
该表记录每个人拥有的文件的文件信息,下面是user_file_list表的详细内容:
CREATE TABLE `user_file_list` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`user` varchar(32) NOT NULL COMMENT '文件所属用户',
`md5` varchar(256) NOT NULL COMMENT '文件md5',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件创建时间',
`file_name` varchar(128) DEFAULT NULL COMMENT '文件名字',
`shared_status` int(11) DEFAULT NULL COMMENT '共享状态, 0为没有共享, 1为共享',
`pv` int(11) DEFAULT NULL COMMENT '文件下载量,默认值为0,下载一次加1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='用户文件列表';
- md5 值:根据该值去 file_info 进一步查找具体的文件
user_info 表
该表记录每个人的详细信息,下面是user_info表的详细内容:
CREATE TABLE `user_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户序号,自动递增,主键',
`user_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名称',
`nick_name` varchar(32) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户昵称',
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码',
`phone` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号码',
`email` varchar(64) DEFAULT '' COMMENT '邮箱',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_nick_name` (`nick_name`),
UNIQUE KEY `uq_user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
- user_name:用户名,唯一
- password:密码,md5 加密
注册功能
业务流程
注册是一个简单的 HTTP 接口,根据用户输入的注册信息,创建一个新的用户。整个程序中并没有使用数据库连接池,每次注册都需要重建连接。
请求URL
URL | http://192.168.52.139/reg |
请求方式 | POST |
HTTP 版本 | 1.1 |
Content-Type | application/json |
请求参数
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
邮箱 | 必须符合 email 规范 | 可选 | 无 | |
firstPwd | 密码 | md5加密后的值(客户端处理) | 必填 | 无 |
nickName | 用户昵称 | 不能超过 32 个字符 | 必填 | 无 |
phone | 手机号码 | 不能超过 16 个字符 | 可选 | 无 |
userName | 用户名称 | 不能超过 32 个字符 | 必填 | 无 |
返回结果参数说明
名称 | 含义 | 规则说明 |
code | 结果值 | 002: 成功 003: 该用户已存在 004: 失败 |
示例
调用接口:
http://192.168.52.139/reg
参数
{
"email": "472251823@qq.com",
"firstPwd": "e10adc3949ba59abbe56e057f20f883e",
"nickName": "milo",
"phone": "18620823143",
"userName": "milo"
}
返回结果
{
"code": "002"
}
MD5
MD5 即 Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广 泛使用的杂凑算法之一(又译摘要算法、哈希算法),理论上 MD5 是不可逆的,而且 MD5 本来也不是作加密使用,而是用来校验数据的完整性,只是因 为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。但是简单密码来说,破解者完全可以将一定范围内的密码字典全部计算出来之后存为数据库,之后 直接查询进行破解。
该项目使用MD5加密用户密码。
登录功能
业务流程
生成token后,然后连接redis,将(username,token)放到redis,并设置过期时间为24h,然后返回登录结果报文。
token的生成过程:生成4个随机数,并拼成一个字符串,然后再加密,再生成base64编码,再用md5加密生成指定长度的字符串。
请求url
URL |
http://192.168.221.152/login
|
请求方式 | POST |
HTTP版本 | 1.1 |
Content-Type | application/json |
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
pwd
|
密码
|
md5
加密后的值
|
必填
| 无 |
user
|
用户名称
|
不能超过
32
个字符
|
必填
| 无 |
返回结果参数说明
名称
|
含义
|
规则说明
|
code
|
结果值
|
000
: 成功
001
: 失败
|
toke
|
令牌
|
每次登录后,生成的
token
不一样,后续其他接口请求时,需要带上
toke
n
。
|
示例
调用接口
Token 验证
Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡。Token 是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token 的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是 Token 就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端生成一个 Token,这个 Token 可以存储在内存、磁盘、或者数据库里,再 把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回 请求的数据
Base64
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法 显示和打印的字符。
当不可见字符在网络上传输时,比如说从 A 计算机传到 B 计算机,往往要经过多个路由设备, 由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不 利于传输的。
为了解决这个问题,我们可以先对数据进行编码,比如 编码,变成可见字符,也就是 ASCII 码可表示的可见字符,从而确保数据可靠传输。 编码的内容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 组成, 正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。
所以,如果要让记事本这样的文本处理软件能处理二进制数据,如:使用json保存二进制信息,需要先把数据先做一个Base64编码,统统变成可见字符,再保存。
在Base64中的可打印字符包括大写英文字母A-Z、小写英文字母a-z、阿拉伯数字0- 9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同,通常用加号(+)和正斜杠( /)。外加“补全符号”,通常用等号(=)。
Base64是一种用64个字符来表示任意二进制数据的方法,常用于在URL、Cookie、网页中传输少量 二进制数据。Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比 原来的长1/3。
(原文)转换前 11111111, 11111111, 11111111 (二进制)
(Base64 编码)转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上传文件
业务流程
每个文件都有一个唯一的 MD5 值(比如 2bf8170b42cc7124b04a8886c83a9c6f),MD5由客户端生成,就好比每个人的指 纹都是唯一的一样,效验 MD5 就是用来确保文件在传输过程中未被修改过。
- 客户端在上传文件之前将文件的 MD5 码上传到服务器
- 服务器端判断是否已存在此 MD5 码,如果存在,说明该文件已存在,则此文件无需再上传, 在此文件的计数器加 1,说明此文件多了一个用户共用。
- 如果服务器没有此 MD5 码,说明上传的文件是新文件,则真正上传此文件
上传文件的MD5
获取数据,提取数据:获取user, token, md5, fileName
token验证:连接redis,获取user对应的token,跟client上传的token做比对校验。
秒传后台数据处理:查找file_info表,获取此md5值文件的文件的引用计数count;若该文件不存在,则返回失败,若该文件已存在:查找user_file_list表,判断该用户是否已有此文件,如果没有则更新各种表,否则不更新各种表;若上传:修改file_info表中的count字段,+1;往user_file_list表中插入一条数据;更新user_file_count表该用户拥有的文件数量。
返回妙传结果:
请求url
URL
|
http://192.168.221.152/md5
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
| 令牌 |
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 005:文件已存在 006: 秒传成功 007: 秒传失败 008: 上传文件成功 009: 上传文件失败 010: 下载文件成功 011: 下载文件失败 |
示例
调用接口
参数
"filename": "Makefile",
"md5": "602fdf30db2aacf517badf4565124f51",
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
}
返回结果
"code": "007"
}
上传文件
客户端上传文件信息具有一定的格式:
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user = "milo"; filename = "xxx.jpg"; md5 = "xxxx"; size = 1024\r\n
Content-Type: application/octet-stream\r\n
\r\n
真正的文件内容\r\n
------WebKitFormBoundary88asdgewtgewx
保存文件到本地:upload_cgi进程将接收到的文件先保存到程序运行的位置。
本地文件转存到FastDFS:upload_cgi进程创建子进程,执行上传文件的命令:fdfs_upload_file /etc/fdfs/client.conf Makefile.txt,然后将执行返回的上传文件路径group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt通过管道发给upload_cgi进程。upload_cgi进程读取管道里的文件路径,并删除零时存放的文件。
拼接文件URL:upload_cgi进程创建一个子进程,执行fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt,显示文件信息,并将信息通过管道发送给父进程,父进程根据信息拼接出文件的URL(http://ip:port/group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt)
Mysql保存文件信息:往file_info表(文件实体)中插入该文件的信息;往user_file_list(我的文件)中插入该文件的信息;查询该用户所拥有的文件的总数,然后更新user_file_count表(用户文件数量)中该用户的信息;
返回上传结果:将此次文件上传结果返回给客户端。
请求url
URL
|
http://192.168.221.152/upload
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/octet-stream
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
|
token
|
同上
|
必填
|
无
|
返回结果说明
名称
|
含义
|
规则说明
|
code
|
结果值
|
008:上传成功
009:上传失败
|
示例
调用接口
参数
Content-Disposition: form-data; user="milo" filename="main.cpp"
md5="5f2a390a60cb3d51355469fea61efa0b" size=198
Content-Type: application/octet-stream
#include "mainwindow.h"
#include <QApplication>
#include "login.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Login w;
w.show();
return a.exec();
}
------WebKitFormBoundarynHRBTFoUv<p3Tewg
返回结果
获取用户文件列表
业务流程
"start"和"count"含义:返回从表的第start行开始,count条数据。
文件列表 json 包
{
"files": [
{
"user": "milo",
"md5": "0afa719eb8a079553d14a2ae68111b82",
"create_time": "2020-06-30 01:22:46",
"file_name": "0voice.png",
"share_status": 0,
"pv": 0,
"url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
"size": 15107,
"type": "png"
}
]
}
- user:文件上传者
- md5: 文件 md5 码
- time:文件上传的时间
- filename : 用户名
- share_status :文件是否已共享,已经共享值为 1,否则值为 0
- pv :文件当前的下载量,下载一次,pv++
- url :文件存放在 fastdfs 分布式存储服务器的 url 地址
- size :文件大小
- type :文件类型
获取用户文件数量
请求url
URL
|
http://192.168.221.152/myfiles?cmd=count
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
|
token
|
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
返回结果说明
名称
|
含义
|
规则说明
|
code
|
结果值
|
110
:验证成功
111
:验证失败
|
num
|
文件数量
|
示例
调用接口
参数
返回结果
获取用户文件信息
请求url
URL
|
http://192.168.221.152/myfiles?cmd=normal
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
|
token
|
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
count
|
文件个数
|
文件个数需大于
0
| 必填 | 无 |
start
|
开始位置
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
files |
文件结果集
|
"user": 用户名称,
"md5": md5 值
,
"create_time": 创建时间, "file_name": 文件名, "share_status": 共享状态, 0 为没有共享, 1 为共享 "pv": 文件下载量,下载一次加 1 "url": URL, "size": 文件大小, "type": 文件类型 |
示例
调用接口
参数
"start": 0,
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
返回结果
"files": [
{
"user": "milo",
"md5": "0afa719eb8a079553d14a2ae68111b82",
"create_time": "2020-06-30 01:22:46",
"file_name": "0voice.png",
"share_status": 0,
"pv": 0,
"url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
"size": 15107,
"type": "png"
}
]
}
按下载量升序
请求url
URL
|
http://192.168.221.152/myfiles?cmd=pvasc
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
|
token
|
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
count
|
文件个数
|
文件个数需大于
0
| 必填 | 无 |
start
|
开始位置
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
files |
文件结果集
|
"user": 用户名称,
"md5": md5 值
,
"create_time": 创建时间, "file_name": 文件名, "share_status": 共享状态, 0 为没有共享, 1 为共享 "pv": 文件下载量,下载一次加 1 "url": URL, "size": 文件大小, "type": 文件类型 |
示例
调用接口
参数
"start": 0,
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
返回结果
"files": [
{
"user": "milo",
"md5": "0afa719eb8a079553d14a2ae68111b82",
"create_time": "2020-06-30 01:22:46",
"file_name": "0voice.png",
"share_status": 0,
"pv": 0,
"url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
"size": 15107,
"type": "png"
}
]
}
按下载量降序
请求url
URL
|
http://192.168.221.152/myfiles?cmd=pvesc
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
|
token
|
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
count
|
文件个数
|
文件个数需大于
0
| 必填 | 无 |
start
|
开始位置
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
files |
文件结果集
|
"user": 用户名称,
"md5": md5 值
,
"create_time": 创建时间, "file_name": 文件名, "share_status": 共享状态, 0 为没有共享, 1 为共享 "pv": 文件下载量,下载一次加 1 "url": URL, "size": 文件大小, "type": 文件类型 |
示例
调用接口
参数
"start": 0,
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
返回结果
"files": [
{
"user": "milo",
"md5": "0afa719eb8a079553d14a2ae68111b82",
"create_time": "2020-06-30 01:22:46",
"file_name": "0voice.png",
"share_status": 0,
"pv": 0,
"url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
"size": 15107,
"type": "png"
}
]
}
分享文件
获取共享文件
分三个接口:
- 获取共享文件个数
- 获取共享文件列表
- 获取共享文件下载排行榜
获取共享文件数量
请求url
URL
|
http://192.168.221.152/sharefiles?cmd=count
|
请求方式
| GET |
HTTP
版本
| 1.1 |
Content-Type
|
application/x-www-form-urlencoded
|
请求参数
无
返回结果说明
名称
|
含义
|
规则说明
|
count
| 数量 |
示例
调用接口
参数
返回结果
获取共享文件列表
请求url
URL
|
http://192.168.221.152/sharefiles?cmd=normal
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
count
|
数量
|
必填
|
无
| |
start
|
开始位置
|
必填
|
无
|
返回结果说明
名称
|
含义
|
规则说明
|
files |
文件结果集
|
"user": 用户名称,
"md5": md5 值
,
"create_time": 创建时间, "file_name": 文件名, "share_status": 共享状态, 0 为没有共享, 1 为共享 "pv": 文件下载量,下载一次加 1 "url": URL, "size": 文件大小, "type": 文件类型 |
示例
调用接口
参数
返回结果
"files": [
{
"user": "milo",
"md5": "0afa719eb8a079553d14a2ae68111b82",
"create_time": "2020-06-30 01:22:46",
"file_name": "0voice.png",
"share_status": 0,
"pv": 0,
"url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
"size": 15107,
"type": "png"
}
]
}
获取共享文件下载排行榜
请求url
URL
|
http://192.168.221.152/sharefiles?cmd=pvdesc
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
count
|
数量
|
必填
|
无
| |
start
|
开始位置
|
必填
|
无
|
返回结果说明
名称
|
含义
|
规则说明
|
files |
文件结果集
| "filename": 文件名, "pv": 文件下载量,下载一次加 1 |
示例
调用接口
参数
返回结果
"files": [
{
"filename": "ui_buttongroup.h",
"pv": 0
}
]
}
处理文件
删除文件
- 先判断此文件是否已经分享
- 判断集合有没有这个文件,如果有,说明别人已经分享此文件(redis 操作)
- 如果集合没有此元素,可能因为 redis 中没有记录,再从 mysql 中查询,如果 mysql 也没有, 说明真没有(mysql 操作)
- 如果 mysql 有记录,而 redis 没有记录,那么分享文件处理只需要处理 mysql (mysql 操作)
- 如果 redis 有记录,mysql 和 redis 都需要处理,删除相关记录
请求url
URL
|
http://192.168.221.152/dealfiles?cmd=del
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
| 令牌 |
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 013: token 验证失败 004:失败 |
示例
调用接口
参数
"filename": "Makefile",
"md5": "602fdf30db2aacf517badf4565124f51",
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
}
返回结果
"code": "013"
}
分享文件
a)先判断此文件是否已经分享,判断集合有没有这个文件,如果有,说明别人已经分享此文件,中断操作(redis操作判断md5+filename是否存在有序集合中)
b)如果集合没有此元素,可能因为redis中没有记录,再从mysql中查询,如果mysql也没有,说明真没有(mysql操作)
c)如果mysql有记录,而redis没有记录,说明redis没有保存此文件,redis保存此文件信息后,再中断操作(redis操作)
d)如果此文件没有被分享,mysql保存一份持久化操作(mysql操作:更新user_file_list表,令对应记录的shared_status=1;在share_file_list表中插入一条记录;更新user_file_count表)
e)redis集合中增加一个元素(redis操作)
f)redis对应的hash也需要变化 (redis操作)
请求url
URL
|
http://192.168.221.152/dealfiles?cmd=pv
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
| 令牌 |
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 010: 成功 011: 失败 012: 别人已经分享此文件 013: token 验证失败 |
示例
调用接口
参数
"filename": "Makefile",
"md5": "602fdf30db2aacf517badf4565124f51",
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
}
返回结果
"code": "016"
}
更新文件下载计数
url:127.0.0.1:80/dealfile?cmd=pv。更新 user_file_list 对用的 pv 值。
请求url
URL
|
http://192.168.221.152/dealfile?cmd=pv
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
token
| 令牌 |
同上
|
必填
|
无
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 016: 成功 |
示例
调用接口
参数
"filename": "object_script.0voiceCloudDisk.Debug",
"md5": "602fdf30db2aacf517badf4565124f51",
"token": "ecf3ac6f8863cd17ed1d3909c4386684",
"user": "wei"
}
返回结果
"code": "016"
}
处理分享文件
取消分享
url:http://ip/dealsharefile?cmd=cancel
- 更新user_file_list表的shared_status = 0
- 查询用户文件的数量 user_file_count
- 如果用户文件数量count为 1 则删除user_file_count对应的行;如果用户文件数量count>1,则更新user_file_count的count-1
- 将文件从 share_file_list 中删除
- 将文件从 FILE_PUBLIC_ZSET 排行榜删除;将文件从FILE_NAME_HASH中移除
请求url
URL
|
http://192.168.221.152/dealsharefile?cmd=cancel
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 018: 成功 019:失败 |
示例
调用接口
参数
"filename": "object_script.0voiceCloudDisk.Debug",
"md5": "602fdf30db2aacf517badf4565124f51",
"user": "wei"
}
返回结果
"code": "018"
}
转存文件
url:http://ip/dealsharefile?cmd=save
将共享文件列表中的某个文件添加到个人文件列表中。
- 先查询是个人文件列表是否已经存在该文件。
- 增加 file_info 表的 count 计数,表示多一个人保存了该文件。
- 个人的 user_file_list 增加一条文件记录
- 更新个人的 user_file_count
请求url
URL
|
http://192.168.221.152/dealsharefile?cmd=save
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 020: 成功 021:文件已存在 022:失败 |
示例
调用接口
参数
"filename": "object_script.0voiceCloudDisk.Debug",
"md5": "602fdf30db2aacf517badf4565124f51",
"user": "wei"
}
返回结果
"code": "020"
}
共享文件下载计数更新
url:http://ip/dealsharefile?cmd=pv
- 更新 share_file_list 的 pv 值(为pv+1)
- 判断filename+MD5是否存在redis的集合(FILE_PUBLIC_ZSET)中,如果存在,则filename+MD5对应的值+1;如果不存在,则从mysql导入数据并将(pv+1,filename+MD5)加入redis有序集合FILE_PUBLIC_ZSET,且redis对应的FILE_NAME_HASH集合加入(filename+MD5, filename).
请求url
URL
|
http://192.168.221.152/dealsharefile?cmd=pv
|
请求方式
| POST |
HTTP
版本
| 1.1 |
Content-Type
|
application/json
|
请求参数
参数名
|
含义
|
规则说明
|
是否必须
|
缺省值
|
user
|
用户名称
|
不能超过
32
个字符
|
必填
|
无
|
MD5
|
MD5值
|
md5
加密后的值
| 必填 | 无 |
filename
|
文件名称
|
不能超过
128
个字符
| 必填 | 无 |
返回结果说明
名称
|
含义
|
规则说明
|
code | 结果值 | 017: 成功 |
示例
调用接口
参数
"filename": "object_script.0voiceCloudDisk.Debug",
"md5": "602fdf30db2aacf517badf4565124f51",
"user": "wei"
}
返回结果
"code": "017"
}