【lesson7】服务端业务处理模块实现

news2024/11/16 0:03:34

文章目录

  • 业务处理实现思路
  • 业务处理类设计
    • 成员变量
    • 成员函数
      • RunModule
      • upLoad
      • listShow
      • downLoad
      • getETagInfo

业务处理实现思路

云备份项目中 ,业务处理模块是针对客户端的业务请求进行处理,并最终给与响应。而整个过程中包含以下要实现的功能:

  • 借助网络通信模块httplib库搭建http服务器与客户端进行网络通信
  • 针对收到的请求进行对应的业务处理并进行响应(文件上传,列表查看,文件下载(包含断点续传))

业务处理类设计

成员变量

private:
    int _server_port;//服务端端口
    std::string _server_ip;//服务端ip
    std::string _download_prefix;//下载前缀
    static std::string _back_dir;//备份文件
    httplib::Server _server;//创建server对象,用于搭建服务器

成员函数

private:
	static void upLoad(const httplib::Request& rq, const httplib::Response& rp)//上传请求,上传数据到服务器
    {}
    static std::string timeToString(time_t t)//返回一个年月日格式的字符类型时间
    {
        return std::ctime(&t);
    }
    static void listShow(const httplib::Request& rq, httplib::Response& rp)//响应数据到客户端浏览器
    {}
    static std::string getETagInfo(const BackupInfo& info)//获取ETag信息
    {}
    static void downLoad(const httplib::Request& rq, httplib::Response& rp)//下载请求,下载数据到客户端
    {}
public:
    serevr()
    {
    	//初始化一些数据
        Config* cnf = Config::getIstance();
        _server_port = cnf->getServerPort();
        _server_ip = cnf->getServerIp();
        _download_prefix = cnf->getDownloadPrefix();
        _back_dir = cnf->getBackDir();
    }
    bool RunModule()//运行模块
    {}

RunModule

HTTP文件上传请求格式:

POST /upload HTTP/1.1
Content-Length:11
Content-Type:multipart/form-data;boundary= ----WebKitFormBoundary+16字节随机字符
------WebKitFormBoundary
Content-Disposition:form-data;filename="a.txt";
hello world
------WebKitFormBoundary--

响应:

HTTP/1.1 200 OK
Content-Length: 0

HTTP文件列表获取请求格式:

GET /list HTTP/1.1
Content-Length: 0

响应:

HTTP/1.1 200 OK
Content-Length:
Content-Type: text/html
<html>
 <head>
   	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 	<title>Page of Download</title>
 </head>
 <body>
 	<h1>Download</h1>
 	<table>
 		<tr>
   			<td><a href="/download/a.txt"> a.txt </a></td>
   			<td align="right"> 1994-07-08 03:00 </td>
   			<td align="right"> 27K </td>
 		</tr>
 	</table>
 </body>
</html>

HTTP文件下载请求格式:

GET /download/a.txt http/1.1
Content-Length: 0

响应:

HTTP/1.1 200 OK
Content-Length: 100000
ETags: "filename-size-mtime一个能够唯一标识文件的数据"
Accept-Ranges: bytes//告诉客户端支持断点续传

HTTP断点续传:

GET /download/a.txt http/1.1
Content-Length: 0
If-Range: "文件唯一标识"
Range: bytes=89-999

响应:

HTTP/1.1 206 Partial Content
Content-Length:
Content-Range: bytes 89-999/100000
Content-Type: application/octet-stream
ETag: "inode-size-mtime一个能够唯一标识文件的数据"
Accept-Ranges: bytes
对应文件从89999字节的数据
bool RunModule()
{
    _server.Post("/upload",upLoad);//处理上传文件请求
    _server.Get("/listshow", listShow);//处理展示页面请求
    _server.Get("/", listShow);//处理展示页面请求
    std::string url = _download_prefix + "(.*)";
    _server.Get(url,downLoad);//处理下载请求
    _server.listen("0.0.0.0", _server_port);//监听所有
    //上面Post/Get的第二个参数全是回调函数, 业务处理逻辑将在其中进行

    return true;
}

upLoad

static void upLoad(const httplib::Request& rq, const httplib::Response& rp)
{
	//1.判断是否有"file"字段, 这个字段是我们自己设置的
    bool ret = rq.has_file("file");
    if(ret == false)
    {
        return ;
    }
	
	//2.获取file字段的所有内容
    const auto& file = rq.get_file_value("file");
    std::string real_path = _back_dir + fileUtil(file.filename).fileName();
    //3.将file字段里的content内容写入到real_path文件中
    fileUtil fu(real_path);
    fu.setContent(file.content);
	
	//4.创建文件信息,并管理起来
    BackupInfo info;
    info.NewBackupInfo(real_path);
    _data->insert(info);
    return;

}

listShow

返回一个HTML页面
效果如图所示
在这里插入图片描述

static void listShow(const httplib::Request& rq, httplib::Response& rp)
{
	//1.获取所有文件信息
    std::vector<BackupInfo> arry;
    _data->getAll(&arry);
    //2.构建HTML响应
    std::stringstream ss;
    ss << "<html><head><title>Download</title></head>";
    ss << " <body><h1>Download</h1><table>";
    for(auto& e : arry)
    {
        ss << "<tr>";

        std::string filename = fileUtil(e.real_path).fileName();
        ss << "<td><a href='" << e.url << "'>" << filename << "</a></td>";

        ss << "<td align='right'>";
        ss << timeToString(e.modify_time);
        ss << "</td>";

        ss << "<td align='right'>";
        ss << e.file_size / 1024 << "K";
        ss << "</td>";

        ss << "</tr>";
    }
    ss << "</table></body></html>";
    rp.body = ss.str();
    rp.set_header("Content-Type", "text/html");
    rp.status = 200;

}

downLoad

static void downLoad(const httplib::Request& rq, httplib::Response& rp)
{
	//1.获取url
    std::string url = rq.path;
    //std::cout << url << std::endl;
    //2.通过url获取文件信息
    BackupInfo info;
    _data->getBifoByUrl(url, &info);
    //std::cout << info.real_path << std::endl;
	
	//3.判断是否是压缩文件
    if(info.pack_flag == true)
    {
        //解压文件
        fileUtil fu(info.pack_path);
        fu.uncompress(info.real_path);
        
        //删除压缩文件, 并修改BackupInfo信息
        fu.Remove();
        info.pack_flag = false;
        _data->insert(info);
    }

    // if(rq.has_header("If-Range"))
    //     std::cout << "hello" << std::endl;
    // else
    //     std::cout << "no" << std::endl;
    // for(auto& e : rp.headers)
    // {
    //     std::cout << e.second << std::endl;
    // }
    
	//4.获取文件内容,并设置响应内容
    fileUtil fu(info.real_path);
    fu.getContent(&rp.body);
    //Accept-Ranges 告诉客户端服务器支持断点续传
    rp.set_header("Accept-Ranges", "bytes");
    rp.set_header("ETag", getETagInfo(info));
    rp.set_header("Content-Type", "application/octet-stream");
    //rp.status = 200;
	
	//判断是否有If-Range字段,并且If-Range字段的ETag内容和getETagInfo(info)的ETag内容一样
    if(rq.has_header("If-Range") && rq.get_header_value("If-Range") == getETagInfo(info))
    {
    	//206 断点续传
        rp.status = 206;
        //std::cout << rp.status << std::endl;
    }
    else
    {
    	//200响应全文
        rp.status = 200;
    }
}

getETagInfo

//服务器自己设计的唯一标识格式
static std::string getETagInfo(const BackupInfo& info)
{
    std::string etag;
    etag += fileUtil(info.real_path).fileName();
    etag += "-";
    etag += std::to_string(info.file_size);
    etag += "-";
    etag += std::to_string(info.modify_time);

    return etag;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1812916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过微软提供的工具制作win10启动盘

1.到如下链接下载微软提供的工具&#xff1a;MediaCreationTool_22H2.exe https://www.microsoft.com/zh-cn/software-download/windows10 2.启动该工具&#xff0c;选择下面选项&#xff0c;根据提示一步步操作即可&#xff08;注意&#xff1a;要提前准备一个实际空间大于8…

javaWeb项目-ssm+vue学生成绩管理系统功能介绍

本项目源码&#xff1a;java基于SSMVUE学生成绩管理系统源码文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SS…

Keil uVision5复制到Word文档后乱码的解决办法

一、问题出现状况 在做嵌入式实验时&#xff0c;我发现在Keil uVision5中正常编写的代码和注释&#xff0c;写入实验报告&#xff08;word&#xff09;中其中文注释就会产生乱码&#xff0c;非常不美观&#xff0c;并且使代码变得杂乱。 如下&#xff1a;Keil uVision5中注释…

最新区块链论文速读--CCF A会议 CCS 2023 共25篇 附pdf下载(4/4)

Conference&#xff1a;ACM Conference on Computer and Communications Security (CCS) CCF level&#xff1a;CCF A Categories&#xff1a;network and information security Year&#xff1a;2023 Num&#xff1a;25 第1~7篇区块链文章请点击此处查看 第8~13篇区块链文…

leetcode 1336 每次访问的交易次数(postgresql)

需求 表: Visits ---------------------- | Column Name | Type | ---------------------- | user_id | int | | visit_date | date | ---------------------- (user_id, visit_date) 是该表的主键 该表的每行表示 user_id 在 visit_date 访问了银行 表: Transactions ----…

用Fay搭建了数字人

文章目录 流程server端ue端 小结 流程 大概是这么一个流程&#xff0c;先去配置server端&#xff0c;然后去配置ue端代码&#xff0c;再接着去android端的。一步一步来&#xff0c;一起学习学习。 server端 去git下载开源代码&#xff0c;然后按照指引一步一个脚印往下走。如…

未来之城:SIGMOD 2024大会在智利圣地亚哥点燃智能革命之火

会议之眼 快讯 2024 年 ACM SIGMOD Conference&#xff08;国际数据管理大会&#xff09;正在于 6月9日至6月14日在智利圣地亚哥举行。它由美国计算机学会&#xff08;ACM&#xff09;的数据管理特别兴趣小组&#xff08;SIGMOD&#xff09;主办&#xff0c;是中国计算机学会&…

7个强大的文字转语音TTS引擎

大家好&#xff0c;文本到语音&#xff08;TTS&#xff09;技术让机器能以人声般自然地“说话”&#xff0c;架起了人机沟通的新桥梁。开源TTS引擎以其开放性和经济性&#xff0c;成为热门工具&#xff0c;为智能应用注入活力。 文本到语音&#xff08;TTS&#xff09;引擎&am…

JVM 根可达算法

Java中的垃圾 Java中"垃圾"通常指的是不再被程序使用和引用的对象&#xff0c;具体表现在没有被栈、JNI指针和永久代对象所引用的对象。Java作为一种面向对象的编程语言&#xff0c;它使用自动内存管理机制&#xff0c;其中垃圾收集器负责检测和回收不再被程序引用的…

python-windows10普通笔记本跑bert mrpc数据样例0.1.048

python-windows10普通笔记本跑bert mrpc数据样例0.1.000 背景参考章节获取数据下载bert模型下载bert代码windows10的cpu进行训练进行预测注意事项TODOLIST背景 看了介绍说可以在gpu或者tpu上去微调,当前没环境,所以先在windows10上跑一跑,看是否能顺利进行,目标就是训练的…

弱智吧”,人类抵御AI的最后防线

“写遗嘱的时候错过了deadline怎么办&#xff1f;” “怀念过去是不是在时间的长河里刻舟求剑&#xff1f;” “英语听力考试总是听到两个人在广播里唠嗑&#xff0c;怎么把那两个干扰我做题的人赶走&#xff1f;” 以上这些饱含哲学但好像又莫名其妙的问题&#xff0c;出自…

【2024算力大会分会 | SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

【2024算力大会分会 | SPIE出版】 2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning *CCPCDL往届均已完成EI检索&#xff0c;最快会后4个半月完成&#xff01; 一、…

Huggingface-cli 登录最新版(2024)

安装Huggingface-cli pip install -U "huggingface_hub[cli]"设置好git的邮箱和用户名和huggingface的github账号一致 git config --global user.mail xxx git config --global user.name xxx登录 复制token&#xff0c;划红线的地方&#xff0c;在命令行中点击右…

SQL 数据库学习 Part 1

数据和信息 信息 信息是客观存在的&#xff0c;是关于现实世界事物的存在方式或运动状态 数据 数据是用来记录信息的可识别的符号&#xff0c;是信息的具体表现形式 数据和信息的联系 数据是信息的符号表示或载体信息则是数据的内涵&#xff0c;是对数据的语义解释 数据…

专业级中文AI文图创作:智源中英双语AltDiffusion开源

AIGC 如火如荼发展的当下&#xff0c;中文世界的创作者常有几大痛点&#xff1a; 思考英文Prompts准确表达的绞尽脑汁&#xff0c;翻译软件词不达意的尴尬&#xff0c;精细构思的 Prompts 在画面生成中找不到一丝痕迹&#xff0c;亦或面对文化误解中的“中国风”哭笑不得…… …

计算机操作系统基础知识:什么是虚拟机?虚拟机的分类有哪些?他们之间的区别是什么?

谈到虚拟机就必须谈谈为什么虚拟机会出现&#xff1f;它解决了哪些问题。 1.虚拟机出现的原因 为了解决传统虚拟机物理资源极大浪费&#xff0c;且希望在一台机器上运行多个应用&#xff0c;且他们之间不相互影响的问题。 下面开始正式介绍虚拟机&#xff1a; 1.虚拟机的定义…

【PX4-AutoPilot教程-TIPS】PX4加速度计陀螺仪滤波器参数设置

PX4加速度计陀螺仪滤波器参数设置 前期准备滤波前FFT图滤波后FFT图 环境&#xff1a; 日志分析软件 : Flight Review PX4 &#xff1a;1.13.0 前期准备 进行滤波器参数设置的前提是飞机简单调试过PID已经可以稳定起飞&#xff0c;开源飞控的很多默认参数是可以让飞机平稳起…

一款开源的图片/视频无损放大神器,本地可用!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 要说无损放大图片/视频分辨率&#xff0c;就绕不开在github上开源的一个图像/视频恢复的实用算法——Real-ESRGAN&#xff0c;截止目前已斩获26.6k的Star量。 RealESRGAN-gui 软件介绍…

C++240611

2.编程题&#xff1a; 以下是一个简单的 比喻&#xff0c;将 多态概念 与 生活中 的 实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c; 如狮子、大象、猴子等。现在&#xff…

冰蝎4.1webshell实验

1、基础环境 生成payload 2、default_xor_base64 HTTP 命令执行 chunked数据回包&#xff0c;48 3、default_xor_base64 HTTPS 命令执行 终端 文件管理 4、 default_aes https 虚拟终端 5、 default_aes http 虚拟终端