【云备份】业务处理

文章目录

  • 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.mzph.cn/news/191395.shtml

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

相关文章

lv11 嵌入式开发 中断处理 15

前言:中断属于7种异常的1种,这节主要讲CPU接收到中断之后怎么处理,回顾之前的知识。 目录 1 异常 1.1 概念 1.2 异常处理机制 1.3 ARM异常源 1.4 异常模式 1.5 ARM异常响应 1.6 异常向量表 1.7 异常返回 ​编辑 1.8 IRQ异常举例 …

scrapyd及gerapy的使用及docker-compse部署

一、scrapyd的介绍 scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API(也即是web api)来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们 scrapyd的安装 scr…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择,有效解决多样性需求多年自研芯片积累,带来性能与性价比双重优势全球基础设施与独特的业务模式,让创新不受限 “科幻作家威廉吉布森说‘未来已至,只是还没有均匀分布’。”2023年6月底,当亚…

抖音短视频账号矩阵系统开发新规则

一、抖音官方平台开发新规: 1.代发布管理应用api接口无法在做新的应用申请 仅针对企事业单位开放,目前要想开发新的抖音矩阵系统,就需要在原有的技术算法上进行新一步的调整。 能力介绍 网站应用开发者可以申请开通【代替用户发布内容到抖…

Unity Meta Quest 一体机开发(八):【手势追踪】实现 Hand Grab 扔物体功能

文章目录 📕教程说明📕设置刚体和碰撞体📕给物体添加 Physics Grabbable 脚本📕给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案,文档,思维导图和工程文件会放入 Seed XR 社区。这是一个高…

【实战教程】PHP如何轻松对接腾讯云COS,实现文件上传下载?

腾讯云提供了一系列丰富的云服务,其中包括对象存储(Cloud Object Storage,简称COS),它是一种高可靠性、可扩展性强的云存储服务。本文将介绍如何使用PHP对接腾讯云COS存储服务,实现文件的上传和下载功能。 …

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

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

hbase Master is initializing

问题如下: ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializingat org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)at org.…

栈实现队列,力扣

题目地址: 232. 用栈实现队列 - 力扣(LeetCode) 难度:简单 今天刷栈实现队列,大家有兴趣可以点上看看题目要求,试着做一下。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

一篇带你串通数据结构

文章目录 导论数据结构的定义数据结构在计算机科学中的重要性为什么学习数据结构很重要 1、基本概念1.1、数据、数据元素和数据项的概念1.2、数据对象与数据结构的关系1.3、逻辑结构与物理结构 2、线性结构2.1、数组2.2、链表2.3、栈2.4、队列 3、非线性结构3.1、树3.2、图 4、…

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

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

Linux ____04、文件内容查看(命令),网络配置(命令),软硬链接(命令)

文件内容查看,软硬链接 一、文件内容查看1、cat 由第一行开始显示文件内容,用来读文章,或者读取配置文件啊,都使用cat名2、tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!3、显示的时候&#xff0c…

CGAL的三维曲面网格生成

1、介绍 此程序包提供了一个函数模板,用于计算三角网格,以近似表面。 网格化算法要求仅通过一个能够判断给定线段、直线或射线是否与曲面相交,并且如果相交则计算交点的oracle来了解待网格化的表面。这一特性使该软件包具有足够的通用性&…

子集(回溯、图解)

78. 子集 - 力扣(LeetCode) 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 样例输入 示例 1:…

深入理解同源限制:网络安全的守护者(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

VMware安装Debian12.2作为服务器(无桌面)

[TOC]VMware安装Debian12.2作为服务器(无桌面) 下载Debian系统 官方网站:https://www.debian.org/index.zh-cn.html 创建新的虚拟机 打开VMware Workstation,点击创建新的虚拟机 向导虚拟机类型选择 一般我会选择典型&…

C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)

目录 一、System.Net命名空间 1.Dns类 (1)示例源码 (2)生成效果 2.IPAddress类 (1)示例源码 (2)生成效果 3.IPEndPoint类 (1) 示例源码 &#xff0…

Unity Image - 镜像

1、为什么要使用镜像 在游戏开发过程中,我们经常会为了节省 美术图片资源大小,美术会将两边相同的图片进行切一半来处理。如下所示一个按钮 需要 400 * 236,然而美术只需要切一张 74*236的大小就可以了。这样一来图集就可以容纳更多的图片。…

基于spring boot电子商务系统

一、 系统总体结构设计 (一) 功能结构图 图1-1 后台管理子系统 图1-2 电子商务子系统功能结构图 (二) 项目结构目录截图(例如下图) 图 1-3 系统目录图 (三) 系统依赖截图 图 1-2 所有依赖截图 (四) 配置文件 1、 全局配置文件 2、 其他配置文…

Leetcode226. 翻转二叉树

文章目录 题目介绍题目分析解题思路边界条件:节点为空时返回空子问题:交换左右子节点 整体代码 题目介绍 题目分析 题目要求我们将树中每个节点的左右子节点全部交换,最后返回交换后的树的根节点。 解题思路 这题是比较常见的递归,直接找边…