当前位置: 首页 > news >正文

【云备份】业务处理

文章目录

  • 1. 业务处理
    • 作用
    • 功能
  • 2. 代码框架编写
    • 构造函数
    • UpLoad ——文件上传请求
    • ListShow —— 展示页面请求处理实现
    • Download —— 下载请求的处理实现
    • 断点续传实现

1. 业务处理

作用

业务处理模块是对客户端的业务请求进行处理

功能

1.文件上传请求:备份客户端上传的文件 响应上传成功
2.文件列表请求:客户端浏览请求备份一个备份文件的展示页面和响应页面
3.文件下载请求:通过展示页面 点击下载 响应客户端要下载的文件数据

2. 代码框架编写

_server_port ——服务端端口号
_server_ip ——服务端ip地址
_download_prefix ——下载请求前缀


因为业务处理模块 也会访问数据管理类
所以在service.hpp中 使用 extern 修饰 在cloud命名空间中的DataManger类中的 全局变量 _data 就可以在其他.c 或者.cpp中使用


构造函数

调用 Config类中的 GetInstance 函数 创建对象 config
再调用 config类中的 GetServerPort 函数 获取客户端端口号
调用GetServerIp 函数 获取客户端IP地址
调用 GetDownloadPrefix 函数 获取URL前缀路径


Post请求方法的 upload资源 表示文件上传
Get请求方法的listshow资源 表示文件列表请求
若只输入 / 表示什么都没有 没有任何资源路径请求


Get请求方法的 download资源,表示文件下载
使用正则表达式
.表示匹配除\n和\r之外的任何单个字符
*表示 匹配前面的子表达式任意次
. *表示匹配任意一个字符 任意次


UpLoad ——文件上传请求

首先判断有没有上传的文件区域
若没有上传的文件区域,就将其状态码设置为400 并返回


若有上传文件区域 ,则获取文件包含的各项数据
通过Config类中的getinstance函数 创建对象,再通过该对象去调用 GetBackDir函数 获取备份文件存放目录


realpath表示实际路径 由备份文件目录 加上 文件名组成
但是file文件中的filename 是包含路径的 ,所以通过调用FileUtil类的匿名对象 去调用FileName函数 获取文件名称即可


通过realpath 实例化一个 FileUtil类的 fu对象
调用Secontent函数 将realpath的数据写入文件中

通过Cloud类中的BackupInfo类 实例化一个对象 info
调用 NewBackupInfo函数 获取各项属性信息到 info中
再通过 DataManger类中的 Insert函数 将info中的信息 添加到 _table哈希表中



ListShow —— 展示页面请求处理实现

定义一个 BackupInfo类型的数组 arry
调用DataManger类中的 GetAll 函数 将table哈希表中的数据 全部放入 arry数组中


以当前html格式 将备份文件数据放入其中


定义一个 stringstream流 类型的变量 ss
将html格式的前两行数据先进行导入到ss中


由于中间的数据是每一个备份文件信息 所以需要遍历arry数组

URL链接 文件名 应该随着每一个文件的不同而改变
所以就不能整体复制过来,需要分别复制

由于URL链接 是由一个双引号扩起来的,与字符串的双引号会造成冲突
在html中不区分双引号和单引号 因此改为单引号
文件名称通过文件实际存储路径 real_path 实例化一个匿名对象 来调用FileName 获取文件名


存储的是文件的最后一次修改时间,正常来说 只需用 mtime 即可
但是mtime是一个时间戳 所以调用接口 ctime 将时间戳转化为时间格式的字符串


调用 fsize函数 获取 文件大小 以字节为单位
而html中 是按照KB表示的,而1KB等于1024字节
所以使其除以1024 获取对应的KB个数



Download —— 下载请求的处理实现

http中的 ETag 字段 存储一个资源的唯一标识
客户端第一次下载文件时,会受到这个响应信息
第二次下载 就会将这个信息发送给服务器 想要让服务器根据唯一标识 判断这个资源有没有被修改过
如果没有被修改过 直接使用原先缓存的数据 不用重新下载了


http协议本身对与ETag中是什么数据并不关心 只要服务端能够自己处理即可
ETag文件名 - 文件大小 - 最后一次修改时间 组成


设置 GetETag 函数 获取http中的 ETage字段


在 table哈希表中寻找 req.path ,若找到了req.path 则返回 对应的 value 值 并传给 info


BackupInfo 类的 pack_flag 变量 表示压缩标志
若pack_flag 为 true 则表示 被压缩 则进入判断中

pack_path 表示 压缩包路径
使用pack_path 实例化一个 FileUtil类的对象 fu

real_path 表示 文件实际存储路径
调用 UnCompress 函数 将 pack_path 解压缩 并将其中的数据 放入 real_path 备份目录中

将pack_flag 改为 false 并使用 update函数 向 table 哈希表中 对应的 path中 更新对应的key值 info


通过 real_path 实例化一个 FileUtil类的对象 fu
调用 GetContent 函数 将 real_path中的数据 放入 body 中


断点续传实现

功能: 当文件下载过程中 因为某种异常而中断 如果再次进行从头下载 效率比较低
因为需要将之前已经传输过的数据 再次传输一遍
因此断点续传 就是从上次下载断开的位置 重新下载即可 之前已经传输过的数据 将不需要重新传输

目的:提高文件的重新传输效率

实现思想:客户端在下载文件的时候 要每次接收到数据 写入文件后记录自己当前下载的数据量
当异常下载中断时,下次断点续传时候 将要重新下载的数据区间(下载的起始位置 和结束位置)
发送给服务器 服务器收到后 仅仅回传 客户端需要的区间数据即可

需要考虑的问题:
若上传下载文件之后 这个文件在服务器上被修改了 则这时候将不能重新断点续传
而是应该重新进行文件下载操作


在http协议中断点续传的实现:
告诉服务器下载区间范围
服务器上要检测 上一次下载之后 这个文件是否被修改过

206状态码 状态码描述为 Partial Content
表示 部分内容 服务器成功处理部分GET请求
即处理区间范围内的请求


在上述 Download函数中 进行修改

retrans表示断点续传 默认设置为false
定义一个string类型的字符串 old_etag 将If-Range字段对应的value值 传给 old_etag
调用 GetETag函数 获取 Etag字段
将 if_range字段的value值 与 请求文件最新的etag比较 ,若一致 则说明为断点续传


httplib 内部 对 Range 请求 已经 做出了 额外的操作
外部用户只需把文件的所有数据 读取到 response的 body中即可
自己就会根据 所请求的区间范围 进行处理 从body中截取指定范围的数据 进行客户端的响应

相关文章:

【云备份】业务处理

文章目录 1. 业务处理作用功能 2. 代码框架编写构造函数UpLoad ——文件上传请求ListShow —— 展示页面请求处理实现Download —— 下载请求的处理实现断点续传实现 1. 业务处理 作用 业务处理模块是对客户端的业务请求进行处理 功能 1.文件上传请求:备份客户端…...

JVM GC算法

一, 垃圾回收分类: 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。 按工作模式分,可以分为并发垃圾回收器和独占式垃圾回收器 按碎片处理方式分,可以分为压缩式垃圾回收器和非压缩式垃圾回收器按工作的内存区间分,又可分为…...

对Spring框架的一些总结

对Spring框架的一些总结 在文章开头我真心推荐大家一个优秀的编程老师:孙帅老师(孙哥suns),孙帅老师在哔哩哔哩的Spring5教学视频时长接近33个小时,从0基础到一步一步手把手的教你抽丝剥茧分析Spring框架的所有知识,孙帅老师的教…...

C# WPF上位机开发(第一个应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 万事开头难,很多事情都是难在第一步。走出了这第一步,回过头看以前走的每一步,发现其实也不难。用c# wpf编写界…...

有点迷糊class和初始化参数的用法了

翻阅手册https://www.runoob.com/python3/python3-class.html Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言&…...

如何选择一款安全稳定的跨境浏览器?

选择适合自己的跨境浏览器是进行跨境电商和跨境交流的关键一步。本文将为您介绍如何客观地选择一款安全稳定的跨境浏览器,以便更好地进行跨境业务。 在选择跨境浏览器时,以下几个因素是需要考虑的: 网络速度:跨境业务需要稳定而高…...

SQL Server 数据库,使用函数查询统计信息

4.1 在查询中使用函数 在前面章节已经学习了一些简单的增、删、改、查询的T-SOL.语句,但是为了更方便快捷地完 成大量的任务,SOLServer提供了一些内部函数,可以和SOLServer的SELECT语句联合使用,也可 以与UPDATE和INSERT一起使用&…...

mysql区分大小写吗

mysql在windows下默认是不区分大小写的,在linux下默认是区分大小写的。 所以,为了避免出问题,许多公司的数据库编程规范中明确规定:库名、表名、列名、索引名一律小写,不同单词之间以下划线分割,且控制在3…...

HarmonyOS 开发案例分享:万能卡片也能用来玩游戏

一、前言 作为一名开发爱好者,从大了讲,我学习并进行 HarmonyOS 相关开发是为了能为鸿蒙生态建设尽一份绵薄之力,从小了讲,就是为了自己的兴趣。而万能卡片是一个让我非常感兴趣的东西。 很多时候我跟别人解释什么是万能卡片&…...

Could NOT find resource [logback-test.xml]

修改 之后就可以正常启动了...

11.28 C++作业

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" <<…...

126. 单词接龙 II

126. 单词接龙 II 需要注意的是&#xff0c;由于要找最短路径&#xff0c;连接 dot 与 lot 之间的边就不可以被记录下来&#xff0c;同理连接 dog 与 log 之间的边也不可以被记录。这是因为经过它们的边一定不会是最短路径。因此在广度优先遍历的时候&#xff0c;需要记录的图…...

SpringBoot+SSM项目实战 苍穹外卖(2)

继续上一节的内容&#xff0c;本节完成新增员工、员工分页查询、启用禁用员工账号、编辑员工、导入分类模块功能代码。 目录 新增员工(完整流程分为以下五个部分)需求分析和设计代码开发功能测试代码完善 (ThreadLocal 线程局部变量)代码提交 员工分页查询代码完善 扩展Spring …...

vue常见优化手段

永远不要过早优化 why&#xff1f;过早优化的代价就是开发时间变长&#xff0c;开发成本增加&#xff0c;它会慢慢的让我们的代码变得不可阅读&#xff0c;难以维护&#xff1b;这些都是优化带来的代价。有句话是这样说的&#xff1a;命运馈赠的礼物&#xff0c;早已在暗中标好…...

vue3通过v-model实现父子组件通信

单一值传递 父组件 <template><div ><h1>v-model实现父子组件通讯</h1><hr><child1 v-model"num"></child1><!-- 上下两个是等价的 --><child1 :modelValue"num" update:modelValue"handle&quo…...

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途&#xff1a;实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序&#xff0c;需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码&#xff0c;那将是多么繁琐&am…...

prometheus|云原生|kubernetes内部安装prometheus

架构说明&#xff1a; prometheus是云原生系统内的事实上的监控标准&#xff0c;而kubernetes集群内部自然还是需要就地取材的部署prometheus服务了 那么&#xff0c;prometheus-server部署的方式其实是非常多的&#xff0c;比如&#xff0c;kubesphere集成方式&#xff0c;h…...

利用Python中的Manim进行数学绘画和创作

相信很多同学就算没听过3Blue1Brown&#xff0c;也一定曾看过他们出品的视频&#xff0c;其从独特的视觉角度解说各种数学概念&#xff0c;内容包括线性代数、微积分、神经网络、傅里叶变换以及四元数等晦涩难懂的知识点。例如最火的《线性代数本质》系列视频。 那么这些视频是…...

Uniapp

UniApp是一个强大的跨平台应用开发框架 随着移动互联网的快速发展&#xff0c;跨平台应用开发成为了一个重要的需求。UniApp就是一个能够满足这一需求的强大框架。本文将介绍UniApp的基本概念、优势、使用方法和未来发展。 一、UniApp概述 UniApp是一个基于Vue.js开发的跨平…...

HNU-青蛙与蚊子

【问题描述】 有 n 只青蛙位于坐标轴 OX 上&#xff0c;对于每只青蛙&#xff0c;有两个已知值 xi、ti&#xff0c;表示第 i 只青蛙在坐标的位置&#xff08;各不相同&#xff09;以及它的舌头的长度。同样有 m 只蚊子一只接一只的落到坐标轴上&#xff0c;对于每只蚊子&#x…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...