我的项目--Automatic CloudBcakup
程序员文章站
2022-07-02 10:02:25
...
一、项目简介
Windows下的客户端对指定路径下的文件进行云备份到Linux下的服务器端,服务器端对非热点文件进行压缩存储,并且支持客户端在浏览器进行浏览或下载备份的文件,方便自动化管理重要文件。
二、整体流程框架
三、使用的接口介绍
1、httplib基本使用:
#include "httplib.h"
static void HelloWorld(const httplib::Request &req, httplib::Response &rsp)
{
rsp.set_content("<html>hello world</html>","text/html");
return;
}
int main()
{
httplib::Server srv;
srv.set_base_dir("./www");
srv.Get("/", HelloWorld);
srv.listen("0.0.0.0", 9000);
}
/*g++ -std=c++0x test.cpp -o test -lpthread -lboost_filesystem -lboost_system*/
2、boost库:
boost库下载路径:点这里
boost库配置:点这里
3、zlib基本使用:
#include <iostream>
#include <fstream>
#include <string>
#include <zlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
bool Compress(const std::string &file)
{
std::string zip = file + ".gz";
int f_fd = open(file.c_str(), O_RDONLY);
if (f_fd < 0)
{
return false;
}
gzFile z_fp = gzopen(zip.c_str(), "wb");
char buf[1024] = {0};
int ret = 0;
while((ret = read(f_fd, buf, 1024)) > 0)
{
gzwrite(z_fp, buf, ret);
}
close(f_fd);
gzclose(z_fp);
return true;
}
bool UnCompress(const std::string &file)
{
boost::filesystem::path path(file);
std::string name = path.replace_extension("").string();
gzFile zf = gzopen(file.c_str(), "rb");
int fd = open(name.c_str(), O_CREAT|O_WRONLY|O_TRUNC, 0664);
char buf[1024] = {0};
int ret = 0;
while((ret = gzread(zf, buf, 1024)) > 0)
{
write(fd, buf, ret);
close(fd);
gzclose(zf);
return true;
}
int main()
{
std::string file = "./test.text";
std::string zip = "./test.text.zip";
//Compress(file);
UnCompress(zip);
return 0;
}
/*g++ test.cpp -lboost_filesystem -lboost_system -lz*/
四、服务端和客户端设计
1、服务端实现功能:
- 提供解析基于https协议的put请求,将文件数据进行备份
- 提供浏览器能够查看服务器上文件信息功能
- 提供浏览器能够下载服务器上的文件功能
- 提供对后台长时间无访问的文件进行压缩存储
class FileTool//文件读写模块
{
public:
static bool Read(const std::string& filename,std::string& body);//从文件读取所有内容
static bool Write(const std::string& filename,const std::string& body);//向文件写入内容
};
class CompressTool//文件压缩模块
{
public:
static bool Compress(const std::string& file_src,const std::string& file_det);//文件压缩
static bool DeCompress(const std::string& file_src,const std::string& file_det);//文件解压缩
};
class DataManage//数据管理模块
{
private:
std::string m_back_file;//持久化存储文件名称
std::unordered_map<std::string,std::string> m_file_list;//数据管理容器
pthread_rwlock_t m_rwlock;//读写锁
public:
DataManage(const std::string& file_path);
~DataManage();
bool Exit(const std::string& filename);//判断文件是否存在
bool IsCompress(const std::string& filename);//判断文件是否已经压缩
bool GetNoncompressList(std::vector<std::string>* list);//获取未压缩文件列表
bool GetGzName(const std::string&src,std::string& det);//通过源文件获取压缩包名称
bool Insert(const std::string& file_src,const std::string& file_det);//插入或更新数据
bool GetAllFileName(std::vector<std::string>* list);//获取所有文件名称
bool InitLoad();//启动时从持久化存储文件中加载数据
};
Cloud_Sys::DataManage data_manage(DATA_FILE);//实例化数据管理对象
class NonHotPotCompress//非热点文件监测模块
{
private:
std::string m_bu_dir;//压缩前的文件路径
std::string m_gz_dir;//压缩后的文件路径
bool IsHotPotFile(const std::string& filename)//判断文件是否为热点文件
public:
NonHotPotCompress(const std::string& bu_dir,const std::string& gz_dir);
bool Start()//总体向外提供的功能接口,开始压缩模块
};
class Server//服务器模块
{
private:
std::string m_file_dir;//上传文件备份路径
httplib::Server m_server;//实例化httplib库提供的Server对象,便于实现http协议
static void FileUpLoad(const httplib::Request& req,httplib::Response& rsp);//文件上传处理回调函数
static void FileList(const httplib::Request& req,httplib::Response& rsp);//文件列表处理回调函数
static void FileDownLoad(const httplib::Request& req,httplib::Response& rsp);//文件下载处理回调函数
public:
bool Start(); //主控流程
};
其中服务器模块在客户端请求处理时:
//下载请求:
请求:GET /list/ HTTP/1.1 /(list/){0,1}
响应:HTTP/1.1 200 OK
//列表请求:
请求:GET /list/filename HTTP/1.1 /list/(.*)
响应:HTTP/1.1 200 OK
Body
//上传请求:
请求:PUT /list/filename HTTP/1.1 /list/(.*)
Range: bytes=range_start-range_end
Content-Length: range_size
Body
响应:HTTP/1.1 200 OK
2、客户端实现功能:
- 提供监控目录的功能,能够获取目录下文件信息,鉴别文件是否需要备份
- 备份文件,基于文件的信息记录,便于文件是否需要备份的鉴别
- HTTPS协议PUT请求,实现文件多线程分块上传功能
class FileTool //文件读写模块
{
public:
static bool Read(const std::string& filename, std::string& body);//从文件读取所有内容
static bool Write(const std::string& filename, const std::string& body);//向文件写入内容
};
class DataManager //文件信息管理模块
private:
std::string m_store_file;//持久化存储信息管理的文件名称
std::unordered_map<std::string, std::string> m_backup_list;//备份文件信息列表,key--文件名,val--etag
public:
DataManager(const std::string& filename) :
m_store_file(filename)
{}
bool Insert(const std::string& key, const std::string& val);//插入/更新信息
bool GetEtag(const std::string& key, std::string& val);//通过文件名获取原有的etag信息
bool Storage();//持久化存储所有文件信息
bool InitLoad();//初始化加载原有文件信息
};
class CloudClient //目录监控模块
{
private:
std::string m_srv_ip;//服务端ip和port
uint16_t m_srv_port;
std::string m_listen_dir;//监控目录名称
DataManager m_data_manage;//数据管理对象
public:
CloudClient(const std::string& filename, const std::string& store_file
,const std::string& srv_ip,const uint16_t& srv_port) :
m_listen_dir(filename),
m_data_manage(store_file),
m_srv_ip(srv_ip),
m_srv_port(srv_port)
{}
bool Start();//主控流程
bool GetBackupFileList(std::vector<std::string>& list);//获取需要备份的文件列表
bool GetEtag(const std::string& filename, std::string& etag);//计算文件的etag信息
};
五、代码实现
上一篇: nginx配置多个PHP项目
推荐阅读
-
我来告诉你:VS2019开发ASP.NET Core 3.0 Web项目,修改视图后,刷新浏览器看不到修改后的效果怎么处理
-
我眼中的网赚项目
-
jsp和excel的数据交换-----我的项目实践
-
我的第一个netcore2.2 api项目搭建(三)
-
我为站长打造一个长久赚钱的项目
-
赚钱的逻辑:我是如何在网上操作项目赚钱的
-
我的微商之路:可持续项目+合适的方法+坚持不懈
-
荐 我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
-
我也开源啦!freemarker+struts2+Spring+Hibernate的JavaEE项目,大家来围观
-
我也开源啦!freemarker+struts2+Spring+Hibernate的JavaEE项目,大家来围观