图床

10 篇文章 0 订阅
1 篇文章 0 订阅

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 进行验证

下载链接:https://dl.pstmn.io/download/latest/win64


尚未完成点

  •  多个小图片拼接成一个大文件,提高存储效率
  •  支持图片处理功能
  •  防盗链

新添加功能

  • 增加了日志记录功能,以便于记录日志错误信息

  •  引用计数方式保存多个相同的图片(使用 MD5 作为存储名,同时在数据库中加入 引用计数

代码链接:https://github.com/Johnson5218/Gallery.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值