【云备份】业务处理

文章目录

  • 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中截取指定范围的数据 进行客户端的响应

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理-第120期 初探Halo数据库(202301201)

数据库管理-第120期 初探Halo数据库(202301201) 12月份正好也是第120期,新的一篇文章,尝试一条新的路线。其实吧,Halo(羲和)这个数据库我较早时间就听说过(早于今年DTCC&#xff0c…

Glide结合OkHttp保证短信验证接口携带图形验证码接口返回Cookie值去做网络请求

一、实现效果 二、步骤 注意:仅展示核心部分代码 1、导入依赖 api com.github.bumptech.glide:glide:4.10.0 kapt com.github.bumptech.glide:compiler:4.10.0 api com.squareup.okhttp3:okhttp:3.11.0 api com.squareup.okhttp3:logging-interceptor:3.11.02、自…

【EMFace】《EMface: Detecting Hard Faces by Exploring Receptive Field Pyramids》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Study5.3 Comparison with State-of-the-Arts 6 Conclusion(own) 1 Background and Motivatio…

腾讯云云服务器功能与优势

腾讯云云服务器(Cloud Virtual Machine,CVM)是腾讯云提供的可扩展的计算服务。使用云服务器 CVM 避免了使用传统服务器时需要预估资源用量及前期投入的问题,帮助您在短时间内快速启动任意数量的云服务器并及时部署应用程序。 云服…

<软考>软件设计师-1计算机组成与结构(总结)

(一)计算机系统基础知识 1 计算机硬件组成 计算机的基本硬件系统由运算器、控制器、存储器、输入设备 和 输出设备 5大部件组成。 1 运算器、控制器等部件被集成在一起统称为中央处理单元(CPU) 。CPU是硬件系统的核心,用于数据的加工处理,能完成各种算…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例) 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.2 配置…

电脑提示mfc100u.dll缺失如何解决?分享有效的5个解决方法

由于各种原因,电脑可能会出现一些问题,其中之一就是电脑提示mfc100u.dll的错误。这个问题可能会导致电脑无法正常运行某些程序或功能。为了解决这个问题,我将分享验证有效的五个修复方法,帮助大家恢复电脑的正常运行。 首先&#…

时间戳转换为日期格式(封装)

在前端开发中,后端有时候传过来的数据为时间戳的格式 而我们又需要将其转换为时间格式来回显。所以需要一个可以转换时间戳的工具。 封装函数 构建一个函数,传入我们的时间戳和我们想要的时间格式,通过JavaScript的时间对象方法,…

基于springboot,vue高校图书馆管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatisredis 本项…

【Unity入门】声音组件AudioSource简介及实现声音的近大远小

AudioSource组件 将需要播放声音的物体挂载Audio Listener组件,实现声音的播放 AudioSource组件属性 (1)AudioClip(音频剪辑):指定播放的音频文件。 (2)Output(音频输…

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记,仅供参考。 需求:提取AUTOSAR SWS中所有的API接口信息,用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例,若需要提取多个SWS文件,遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…

HTTP 基本概念(计算机网络)

一、HTTP 是什么? HTTP(HyperText Transfer Protocol) :超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

检测判断IP合法性API接口

检测判断IP合法性API接口 一、检测判断IP合法性API接口二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、检测判断IP合法性API接口 一款免费的帮助你检测判断IP合法性API接口 二、…

基于算能的国产AI边缘计算盒子,内置强悍TPU | 32TOPS INT8算力

边缘计算盒子 内置强悍TPU | 32TOPS INT8算力 ● 支持浮点运算的TPU平台盒子,支持32TOPSINT8,16TFLOPSFP16,2TFLOPSFP32高算力 ● 单芯片最高支持32路H.264 & H.265的实时解码能力 ● 支持国产算法框架Paddle飞桨,适配Caf…

【开源存储】glusterfs分布式文件系统部署实践

文章目录 一、前言1、介绍说明2、术语说明3、冗余模式3.1、复制卷(Replication)3.2、纠删卷(Erasure Code) 二、部署说明1、软件安装2、集群部署2.1、前置准备2.2、部署过程a、添加节点b、配置存储c、创建glusterfs卷d、客户端挂载…

外包搞了6年,技术退步明显......

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

k8s中pod的hostport端口突然无法访问故障处理

故障背景: 租户告知生产环境的sftp突然无法访问了,登录环境查看sftp服务运行都是正常的,访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查,看看哪里出了问题,看下sftp日志&#…

进程间通信 管道

在Linux中,管道是一种通信机制,用于将一个程序的输出直接连接到另一个程序的输入。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,它可以克服使用文件进行通信的两个问题,具体表现为限制管道的大…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…

SpringCloudSleuth+Zipkin 整合及关键包汇总

背景 整合了一下 SpringCloudSleuth Zipkin,本来是很简单的东西,但是最终导出依赖包时没注意,导致目标服务始终没有被纳入 Zipkin 的链路追踪中,本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…