一、本项目涉及的所有知识点
1. 简单的Web服务器设计能力
2. C/C++ 操作 MySQL 数据库
3. 数据库设计
4. Restful 风格 API
5. json 和 jsoncpp 的使用
6. 强化 HTTP 协议的理解
7. cpp-httplib 的使用和原理
8. 正则表达式
9. 基于 md5 进行校验
10. Postman 工具的使用
11. 软件测试的基本思想和方法
二、项目扩展点
1.存储时合并小文件
如果上传大量的比较小的文件时,在磁盘空间不太充裕时可能会产生磁盘碎片,把这些逻辑上比较小的文件合并成一个比较大的物理文件,在读取文件时,数据库中除了存该文件的路径之外,再存一个偏移量,在已知路径的相对偏移量开始读起,就可以正常读取文件。
2.防盗链
增加权限控制,只让图片能被特定的用户使用。
防盗链的方法:使用登录验证,判断引用地址,例如使用 cookie、POST 下载、图形验证码等方法。其中使用 cookie 是通过实现用户账户功能,登录之后就得到了 cookie,有了 cookie 就可以正常使用。
相关博客:https://www.cnblogs.com/wangyongsong/p/8204698.html
3.图片处理功能
比如缩略图功能,如果原图片比较大,相同带宽下缩略图加载更快。可以在用户请求时添加一个参数,比如width=100&length=120。以及一些其他图片处理功能。
借助 C++ 图片处理库:计算机视觉库 OpenCV ,开源图形库 FreeImage 等。
4.相同图片只保留一份
通过 md5 值判断文件内容是否相同,引用计数方式,调用时访问同一个文件,以节省服务器资源。删除时若计数大于1,则只将计数减1并删除图片信息,如果为1则同时删除该文件。
三、项目中遇到的问题及解决办法
1.Json::StyledWriter 被新函数替代
–>在文件顶端添加如下代码以继续使用该函数:
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning(disable : 4996)
#endif
2.若要使用 file.offset、file.length,需要使用2017版 httplib.h
我的 Github 链接:
https://github.com/Dex5wu/Project-Image-Server/blob/master/httplib.h
3.第一次用浏览器向服务器发送请求时响应超时
推测是服务器防火墙没有关,关闭后果然可以正常访问了
防火墙相关指令:
//查看防火墙的状态(是否有开启)
systemctl status firewalld
service iptables status
//暂时关闭防火墙
systemctl stop firewalld
service iptables stop
//暂时关闭后,开启防火墙
systemctl start firewalld
service iptables start
//永久关闭防火墙(开机禁用)
systemctl disable firewalld
chkconfig iptables off
//重启防火墙
service iptables restart
//永久关闭后,开启防火墙(开机自动启用)
systemctl enable firewalld
chkconfig iptables on
4.使用了正则表达式后,发现代码运行总是报错 “已放弃(吐核)”
查询后发现是因为g++版本太低,不支持正则表达式
如何查看当前g++版本:g++ -v
将 g++ 升级到 8.3.1 之后就没问题了
四、项目成果使用方法
1.上传图片: http://47.106.245.188:9094/upload.html
2.查看所有图片信息: http://47.106.245.188:9094/image
3.查看指定图片信息: http://47.106.245.188:9094/image/1
4.查看指定图片内容: http://47.106.245.188:9094/show/1
5.删除指定图片: http://47.106.245.188:9094/image/1 (删除要在Postman上选DELETE)
服务器运行后,前4条链接可在任何客户端上使用,可以上传图片、查看图片信息、使用图片内容。因为删除较为麻烦,一定程度上避免了误删的情况。
还可以在 CSDN 写博客时使用服务器中的图片,使用方法为:
1.点击“图片”
2.选择链接添加
3.之后将相应的 URL 填入即可