Gallery
因为总有一些网站不支持图片上传功能,必须要使用图片链接,在我学习了数据库和网络的相关知识后,我决定向大家提供一个简易的图床
整体架构
核心就是一个 HTTP 服务器,
提供对图片的增删改查功能 同时搭配简单的页面辅助完成图片上传功能
使用 Json 作为数据交互格式
数据库模块
将相关数据库操作封装起来 表的相关结构
create table image_table{
image_id int not null primary key auto_increment,
image_name varchar(256),
size int,
upload varchar(50),
md5 varchar(128),
type varchar(128),
path varchar(1024)
};
这个文件相当于 model 层. 只进行数据的基本 CURE ,不涉及到更复杂的数据加工
在这个库中封装了如下功能.
- 插入单条数据 Insert
- 查询单条数据 Selectone
- 查询所有数据 SelectAll
- 删除单个数据 Delete
#include <iostream>
#include "db.hpp"
using namespace image_system;
void TestImageTable() {
bool ret = false;
//更友好的格式化显示 Json
Json::StyledWriter writer;
MYSQL* mysql = MySQLInit();
Json::Value image;
image["name"] = "滑稽.jpg";
image["size"] = 16 * 1024;
image["upload_time"] = "2019/01/01";
image["md5"] = "987654321";
image["content_type"] = "image/jpg";
image["path"] = "./滑稽.jpg";
std::cout << "==============测试插入=====================" << std::endl;
ImageTable image_table(mysql);
ret = image_table.Insert(image);
std::cout << "Insert: " << ret << std::endl;
std::cout << "==============测试查找=====================" << std::endl;
Json::Value images;
ret = image_table.SelectAll(&images);
std::cout << "SelectAll: " << ret << std::endl
<< writer.write(images) << std::endl;
Json::Value image_out;
ret = image_table.SelectOne(1, &image_out);
std::cout << "SelectOne: " << ret << std::endl
<< writer.write(image_out) << std::endl;
std::cout << "==============测试删除=====================" << std::endl;
int image_id = 2;
ret = image_table.Delete(image_id);
std::cout << "Delete: " << ret << std::endl;
MySQLRelease(mysql);
}
int main() {
TestImageTable();
return 0;
}
对数据库进行测试
功能测试通过
服务器模块
此模块使用了 httplib 这个开源库
#include "httplib.h"
int main() {
using namespace httplib;
Server server;
server.Get("/", [](const Request& req, Response& resp) {
(void)req;
resp.set_content("<html>hello</html>", "text/html");
});
server.set_base_dir("./wwwroot");
server.listen("0.0.0.0", 9094);
return 0;
}
在这个模块中实现了如下功能
- 图片上传接口
- 查看所有图片信息接口
- 查看单个图片信息接口
- 查看图片内容接口
- 删除图片接口
使用 Postman 进行测试
- 图片上传功能测试成功
- 查看所有图片信息接口
- 查看单个图片信息接口
- 查看指定图片内容
查看不存在图片时返回404
- 删除图片接口
项目功能测试完毕
因为此项目只是图床功能,所以性能只与网络带宽有关,所以暂时无须进行性能测试
相关知识点
什么是MD5?
这是一种常见字符串 hash 算法, 具有三个特性:
1. 不管源字符串多长, 得到的最终 md5 值都是固定长度
2. 源字符串稍微变化一点点内容, md5 值会变化很大(降低冲突概率)
3. 通过原字符串很容易计算得到 md5 值, 但是根据 md5 推导出原字符串很难(几乎不可能).
使用 Json 作为数据交互格式
1. json 出自 JavaScript, 是一种非常方便的键值对数据组织格式
2. C++ 中可以使用 jsoncpp 这个库来解析和构造 json 数据
使用 Postman 进行验证
尚未完成点
- 多个小图片拼接成一个大文件,提高存储效率
- 支持图片处理功能
- 防盗链
新添加功能
-
增加了日志记录功能,以便于记录日志错误信息
-
引用计数方式保存多个相同的图片(使用 MD5 作为存储名,同时在数据库中加入 引用计数)