图片存储服务端
项目描述
实现一个HTTP服务器,使用这个服务器来存储图片,并且为每张图片提供唯一的URL,使用URL将图片展示到网页上面。
功能
1、上传图片
2、查看图片内容
3、查看每个图片属性
4、删除图片
项目模块划分
数据库存储模块
使用MySQL数据库进行存储。
MD5
MD5简介
MD5是一种字符串哈希算法,由于任意的字符串的MD5是固定长。
由字符串求MD5很简单,但是由MD5反向求字符串是一件很困难的事情。
只要字符串稍有变化,所求得的MD5值就有很大的区别。
MD5应用
1、用于密码管理;
2、垃圾邮箱的筛选;
3、电子签名;
4、用来校验文件内容的准确性。
259 std::string StringMD5(const std::string& str)
260 {
261 const int md5_length=16;
262 unsigned char MD5result[md5_length];
263 // 使用OpenSSL函数计算MD5
264 MD5((const unsigned char*)str.c_str(),str.size(),MD5result);
265 // 转换成字符串方便查看
266 char out[1024] = {
0};
267 int off = 0;
268 for(int i = 0;i < md5_length; ++i)
269 {
270 off += sprintf(out + off,"%x",MD5result[i]);
271 }
272 return std::string(out);
273 }
数据库设计
创建一张表来存储信息:
CREATE TABLE `image_table` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(256) DEFAULT NULL,
`size` int(11) DEFAULT NULL,
`upload_time` varchar(50) DEFAULT NULL,
`type` varchar(128) DEFAULT NULL,
`path` varchar(1024) DEFAULT NULL,
`md5` varchar(128) DEFAULT NULL,
PRIMARY KEY (`image_id`)
);
对数据库初始化:
11 static MYSQL *MySQLInit()
12 {
13 //使用mysql API来操作数据库
14 //1、先创建一个mysql的句柄
15 MYSQL* mysql = mysql_init(NULL);
16 //2、使用句柄和数据库建立连接
17 if (mysql_real_connect(mysql,"127.0.0.1","root","root","image_system",3306,NULL,0) == NULL)
18 {
19 //数据库连接失败
20 printf("连接失败%s\n",mysql_error(mysql));
21 return NULL;
22 }
23 //3、设置编码格式
24 mysql_set_character_set(mysql,"utf8");
25 return mysql;
26 }
27
28 static void MySQLRelease(MYSQL* mysql)
29 {
30 mysql_close(mysql);
31 }
插入语句拼装:
54 bool Insert(const Json::Value& image)
55 {
56 char sql[4 * 1024] = {
0};
57 sprintf(sql,"insert into image_table values(null,'%s',%d,'%s','%s','%s','%s')",
58 image["image_name"].asCString(),
59 image["size"].asInt(),image["upload_time"].asCString(),
60 image["type"].asCString(),image["path"].asCString(),
61 image["md5"].asCString());
62 printf ("[Insert sql] %s\n",sql);
63
64 int ret = mysql_query(_mysql,sql);
65 if(ret != 0)
66 {
67 printf ("Insert 执行SQL 失败! %s\n",mysql_error(_mysql));
68 return false;
69 }
70 return true;
71
72 }
查询语句的拼装:
74 bool SelectALL(Json::Value* images)
75 {
76 char sql[1024 * 4] = {
0};
77 sprintf(sql,"select * from image_table");
78 int ret = mysql_query(_mysql,sql);
79 if(ret != 0)
80 {
81 printf("SelectALL 执行 SQL 失败!%s\n",mysql_error(_mysql));
82 return false;
83 }
84 //遍历结果集合,并把结果集写到image 参数中
85 MYSQL_RES* result = mysql_store_result(_mysql);
86 int rows = mysql_num_rows(result);
87 for(int i = 0; i < rows; ++i)
88 {
89 MYSQL_ROW row = mysql_fetch_row(result);
90 //数据库查出的每条记录都相当于一个图片信息
91 //需要吧这个信息转成JSON格式
92 Json::Value image;
93 image["image_id"] = atoi(row[0]);
94 image["image_name"] = row[1];
95