如何看网站的ftp网站建设的特色

bicheng/2026/1/20 13:02:20/文章来源:
如何看网站的ftp,网站建设的特色,asp做微网站设计,权威的郑州网站建设此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理#xff1a; 文件上传请求#xff1a;备份客户端上传的文件#xff0c;响应上传成功客户端列表请求#xff1a;客户端请求备份文件的请求页面#xff0c;服务器响应文件下载请求 文件上传请求备份客户端上传的文件响应上传成功客户端列表请求客户端请求备份文件的请求页面服务器响应文件下载请求通过展示的文件列表点击下载服务器响应下载的文件数据 文章目录 1. 网络通信模块设计2. 业务处理模块设计文件上传业务处理 /upload请求展示备份文件页面 / /listshow请求文件下载业务处理 /download断点续传原理 3. 服务器代码4. 代码位置 1. 网络通信模块设计 文件下载Http请求部分如下通过分隔符可以取到文件数据和文件的其他信息文件信息和文件内容之间空行隔开。这个解析过程httplib库已经封装完毕 网络通信请求设计 文件上传服务器收到/upload 是为文件上传展示页面服务器收到/listshow是服务器所有备份文件展示 响应 HTTP/1.1 200 OK 构造html正文界面文件下载服务器收到/download/文件名 为文件下载请求 响应 HTTP/1.1 200 OK 文件数据正文 2. 业务处理模块设计 文件上传业务处理 /upload请求 #pragma once #include backups.hpp #include ./httplib/httplib.h #include ./config/config.hpp extern CloudBackups::DataMange *dataMange; namespace CloudBackups {class Server{private:int port;std::string ip;std::string download_prefix;httplib::Server server;// 上传文件static void Upload(const httplib::Request request, httplib::Response response){LOG(INFO, upload begin);// POST请求文件数据在http正文中分区存储bool ret request.has_file(file); // 判断有无上传文件字段if (ret false){LOG(ERROR, request error!);response.status 400;return;}// 获取数据const auto file request.get_file_value(file);std::string backdir Config::GetInstance()-GetBackDir();// 保存文件std::string filepath backdir FileUtil(file.filename).filename(); // 实际路径文件名FileUtil stream(filepath);stream.setContent(file.content);// 更新文件信息Json文件BackupInfo info(filepath);dataMange-Insert(info);LOG(INFO, upload success);}// 展示页面static void ListShow(const httplib::Request request, httplib::Response response){}// 下载文件static void Download(const httplib::Request request, httplib::Response response){}public:Server(){Config *config Config::GetInstance();port config-GetServerPort();ip config-GetServerIp();download_prefix config-GetDownloadPrefix();LOG(INFO, init server success);}bool RunMoudle(){LOG(INFO, server running);// 搭建Http服务器server.Post(/upload, Upload); // 文件上传server.Get(/list, ListShow); // 展示页面server.Get(/, ListShow); // 网页根目录也是展示页面std::string download_url download_prefix (.*);server.Get(download_url, Download); // 下载文件,正则表达式捕捉要下载的文件if (server.listen(ip, port) false){LOG(FATAL, server listen failed! ip ip);return false;}return true;}}; }单元测试运行截图 // #include util/fileutil.hpp #include vector #include util/json.hpp #include config/config.hpp #include backups.hpp #include hot.hpp #include server.hpp CloudBackups::DataMange *dataMange; void ServerUtilTest() {CloudBackups::Server server;dataMange new CloudBackups::DataMange();server.RunMoudle(); } int main(int argc, char const *argv[]) {ServerUtilTest();return 0; }上传文件的信息Json如下 展示备份文件页面 / /listshow请求 #pragma once #include backups.hpp #include ./httplib/httplib.h #include ./config/config.hpp extern CloudBackups::DataMange *dataMange; namespace CloudBackups {class Server{private:int port;std::string ip;std::string download_prefix;httplib::Server server;// 上传文件static void Upload(const httplib::Request request, httplib::Response response){}// 展示页面static void ListShow(const httplib::Request request, httplib::Response response){LOG(INFO, list show begin);// 获取所有文件信息std::vectorBackupInfo array;dataMange-GetAll(array);// 根据所有文件信息构建http响应std::stringstream ss;ss R(!DOCTYPE htmlhtml langcnheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titledownload list/title/headbody);ss R(h1 aligncenterDownload List/h1);for (auto info : array){std::string filename FileUtil(info.real_path).filename();ss R(trtda href) info.url R() filename /a/td;ss R(td alignright ) convertTimeStamp2TimeStr(info.mtime) /td;ss R(td alignright) info.size / 1024 Kb/td/tr;ss br;}ss /body/html;response.body ss.str();response.set_header(Content-Type, text/html);response.status 200;LOG(INFO, list show end);}// 下载文件static void Download(const httplib::Request request, httplib::Response response){}public:Server(){Config *config Config::GetInstance();port config-GetServerPort();ip config-GetServerIp();download_prefix config-GetDownloadPrefix();LOG(INFO, init server success);}bool RunMoudle(){LOG(INFO, server running);// 搭建Http服务器server.Post(/upload, Upload); // 文件上传server.Get(/list, ListShow); // 展示页面server.Get(/, ListShow); // 网页根目录也是展示页面std::string download_url download_prefix (.*);server.Get(download_url, Download); // 下载文件,正则表达式捕捉要下载的文件if (server.listen(ip, port) false){LOG(FATAL, server listen failed! ip ip);return false;}return true;}}; }文件下载业务处理 /download http的ETag头部字段存储了一个资源的唯一标识 客户端第一次请求文件时会收到响应信息。 客户端第二次下载时客户端会把这个信息发送给服务器让这个服务器根据这个标识判断这个资源有没有被修改锅。如果没修改过。客户端直接使用缓存区的资源。如果改过则重新修改 http对ETag字段没有定义这里设定 ETags文件名称-文件大小-最后修改时间 构成 ETags字段也用于断点续传断点续传也需要保证文件没有被修改 http协议的Accept-Ranges:bytes字段用于表示支持断点续传。数据以字节结尾 Content-Type字段决定了浏览器如何处理响应正文用来区分下载还是html显示。 Content-Typeapplication/octet-stream常用于文件下载 断点续传原理 文件下载时由于异常而中断如果从头下载效率较低需要将之前传输过的数据效率太低。断点续传的目的为了提高上传效率 实现客户端在下载时需要记录当前下载的位置。当下载中断时下次断点续传时将下载起始位置发送给服务器。服务器收到后仅仅回传客户端需要的数据即可 如果下载文件后这个文件在服务器上被修改了这时候需要将文件重新下载 http中断点续传关键点在于告诉服务器下载区间范围服务器上要检测这个文件是否被修改。 http协议的Accept-Ranges:bytes字段用于表示支持断点续传 ETag文件唯一标识符客户端收到响应会保存这个信息 请求 GET /download/test.txt HTTP/1.1 If-Range:“服务端在下载时响应ETag字段搭配使用判断文件是否被修改常用于恢复下载” Range: bytes100-200(区间范围) 这个字段用来告诉客户端需要的数据范围 响应 HTTP/1.1 206(服务器处理部分get请求) Paritial Content ETag:”xxxx“响应资源的版本标识符判断文件是否被修改 Content-Range: bytes 100-200(范围) Accept-Ranges: bytes 字段用于表示支持断点续传 正文就是对应区间的数据 真正实现时cpp-httplib会自动根据请求Range字段对response.body进行切片返回封装实现。直接把response.body全部设置为文件所有内容即可 #pragma once #include backups.hpp #include ../httplib/httplib.h #include ../config/config.hpp extern CloudBackups::DataMange *dataMange; namespace CloudBackups {class Server{private:int port;std::string ip;std::string download_prefix;httplib::Server server;// ETag为设计者自行指定 ETags文件名称-文件大小-最后修改时间 构成static std::string GetETag(BackupInfo info){std::string etag FileUtil(info.real_path).filename();etag -;etag std::to_string(info.size);etag -;etag std::to_string(info.mtime);return etag;}// 下载文件static void Download(const httplib::Request request, httplib::Response response){// 1. 获取客户端请求资源的路径 request.path// 2. 根据路径获取文件备份信息BackupInfo info;if (dataMange-GetByUrl(request.path, info) false){LOG(WARNING, file /download not found);response.status 404;return;}// 3. 判断文件是否被压缩,被压缩的话需要先解压缩删除压缩包修改备份信息if (info.packflag true){// 被压缩,解压到backdir目录浏览FileUtil tool(info.pack_path);tool.unzip(info.real_path);// 删除压缩包tool.removeFile();info.packflag false;// 修改配置文件dataMange-UpDate(info);}// 4. 读取文件数据放入body中FileUtil tool(info.real_path);tool.getContent(response.body);// 判断断点续传bool retrans false; // 标记断点续传std::string befetag;if (request.has_header(If-Range)){// 断点续传 服务端在下载时响应ETag字段搭配使用判断文件是否被修改befetag request.get_header_value(If-Range);if (befetag GetETag(info)){// 文件没修改过retrans true;}}// 没有If-Range字段或者If-Range字段与ETag不匹配重新下载if (retrans false){// 正常下载// 5. 设置响应头部字段ETag Accept-Range字段response.set_header(ETag, GetETag(info));response.set_header(Accept-Ranges, bytes);response.set_header(Content-Type, application/octet-stream);response.status 200;}else{// 断点续传了解区间范围response.set_header(ETag, GetETag(info));response.set_header(Accept-Ranges, bytes);response.status 206; // cpp-httplib会自动根据请求Range字段对response.body进行切片返回封装实现}LOG(INFO, download success);}public:Server(){Config *config Config::GetInstance();port config-GetServerPort();ip config-GetServerIp();download_prefix config-GetDownloadPrefix();// 创建文件夹FileUtil tool;tool.mkdir(Config::GetInstance()-GetBackDir());tool.mkdir(Config::GetInstance()-GetPackfileDir());LOG(INFO, init server success);}bool RunMoudle(){LOG(INFO, server running);// 搭建Http服务器server.Post(/upload, Upload); // 文件上传server.Get(/list, ListShow); // 展示页面server.Get(/, ListShow); // 网页根目录也是展示页面std::string download_url download_prefix (.*);// LOG(INFO, DEBUG: download_url);server.Get(download_url, Download); // 下载文件,正则表达式捕捉要下载的文件if (server.listen(ip, port) false){LOG(FATAL, server listen failed! ip ip);return false;}return true;}}; }3. 服务器代码 #include vector #include ../util/json.hpp #include ../config/config.hpp #include backups.hpp #include hot.hpp #include server.hpp #include thread CloudBackups::DataMange *dataMange; void ServerRun() {CloudBackups::Server server;dataMange new CloudBackups::DataMange();server.RunMoudle(); } void HotRun() {dataMange new CloudBackups::DataMange();CloudBackups::HotMange hot;hot.RunModule(); } int main(int argc, char const *argv[]) {// 启动热点管理模块std::thread hot_thread(HotRun);std::thread server_thread(ServerRun);hot_thread.join();server_thread.join();return 0; }4. 代码位置 至此项目服务器所有业务处理完毕 Gitee Github

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

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

相关文章

wordpress高度还原设计稿百度优化 几个网站内容一样

如今,越来越多的企业会考虑建立一个企业官方网站来展示企业形象,或者建立一个电子商务网站平台来拓展业务渠道,或者建立一个企业内部网来协助企业进行网上工作。 网站建设的类型有很多种,不同类型的网站成本差异很大。 因此&#…

制作网页的网站推荐wordpress rss采集

背景 实际业务中经常需要展示某个网站, 并且希望在展示的时候单击网站可直接访问, 本节演示在表格中如何添加超链接支持. 需求 假设我需要渲染一个Study类, 它只有三个属性id,name和website, 其中id只支持展示, name只支持编辑, 而website只支持单击时跳转到相应的网站, 效果…

做服装设计兼职的网站湖南做旅游网站哪家最好

目录 一.什么是Qt元对象系统? 二.编译时Qt Creator偷摸做了哪些事情? 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统? Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

点击图片跳转到网站怎么做链接网页源码下载

文章目录 1、交叉类型2、联合类型3、类型保护3.1 用户自定义的类型保护3.2 typeof 类型保护3.3 instanceof类型保护 4、类型别名4.1 定义- 接口 vs. 类型别名 5、可辨识联合6、索引类型6.1 类型操作符:- 索引类型查询操作符:keyof T- 索引访问操作符&…

马化腾做的电商网站建设部注册师网站

题目 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World" 输出&#…

潍坊手机网站建设南京网络优化培训

scratch像素画板 第十四届青少年蓝桥杯scratch编程省赛真题 一、题目要求 编程实现 1.点击绿旗,角色、背景如图所示(三种颜色调色盘、清除图标及方格角色请自行创建,点击绿旗后立刻呈现下图效果); 2.用鼠标点击红色调色盘,红色调色盘变为选中状态(如下图所示),此时鼠…

这么做3d网站做网站维护工商经营范围是什么

Amazon Simple Email Service (SES) 是一项强大的电子邮件发送服务,适用于数字营销、应用程序通知以及事务性邮件。在这个实战指南中,我们将演示如何设置 AWS SES 并通过几个示例展示其用法。 设置 AWS SES 1. 创建 AWS 账户 首先,您需要创…

宜春网站建设推广深圳营销型企业网站

车载诊断协议DoIP系列 —— 传输层控制协议(TCP)&用户数据报协议(UDP) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎…

网站规划的基本原则华梦服饰网站建设中

1 什么是迭代器,生成器,装饰器 2 django的信号用过吗?如何用,干过什么 3 什么是深拷贝,什么是浅拷贝,如何使用 3.1 浅拷贝 3.2 深拷贝 3.3 扩展(slice操作符和list构造函数) 1 什么是迭代器,生成…

网站开发准备工作网站开发薪水

2021年12月10日,由广东省游戏产业协会、广东省虚拟现实产业技术创新联盟、深圳市科学技术协会、深圳市互联网文化市场协会指导,陀螺科技主办,深圳市科技开发交流中心、恒悦创客魔方协办,行业头部媒体游戏陀螺、VR陀螺、陀螺电竞、…

cms网站建设的实训总结电子商务网站制作公司

文章目录 在Unity中,方括号 [ ] 通常用于表示属性、特性(Attributes)或者元数据(Metadata)。这些标记提供了附加信息,可以用于修改类、方法、字段等的行为或者在编辑器中进行设置。 以下是一些常见的用法&…

做外围网站代理违法吗南宁网络公司多少钱

使用LVM分区方式安装Manjaro发行版 为什么单独介绍LVM方式呢? 主要是由于使用系统的图形安装工具创建卷组会出问题,会导致图形安装工具直接挂掉,唯一的方法是提前手动创建好卷组。 GPT分区表 分区表有: MBR(主引导记录分区表)…

做结婚视频储存网站备案 个人网站

一. 免密登录 Grafana 的常用方式: 将配置好的Grafana图嵌入到系统页面中 为了实现可免登录访问,可以通过如下方式进行设置: 1. 修改Grafana配置文件 在Grafana的配置文件 /etc/grafana/grafana.ini 中,找到 [auth.anonymous] 配…

课工场网站建设培训网站美工做专题尺寸多少?

培训计划是预设好的一套课程系列,包含课程和考试,分多个阶段,每完成一个阶段就会在学习地图上留下标记,让用户看到自己的努力成果,增强成就感,从而坚持完成课程。 企业内部培训考试系统中如何设置培训计划…

网站写动态新闻有什么好处网站建设 快速

爬虫、网络编程、接口......对于Python工程师来讲都绕不过一个强大的模块---requests,本篇文章就深入详细讲一讲requests模块。同时也先也分享一下开源API网站:Gitee-API文档、JSONPlaceholder API文档、和风天气API文档、Postman Echo API网站&#xff…

现在什么类型网站没有人做微信怎么自己创建小程序

做副业项目,保持平常心。 不能因为自认为很好的作品,数据不好看,就哭哭闹闹。 平常心,坚持日更,保持持续刷新自己,提升自己的飞轮状态。 不以物喜,不以己悲,哈哈。 无论是副业还是…

义乌网站建设九在哪里可以买到客户数据

纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态但是实际的编程中,特别是前端的编程范畴里,“不依赖外部环境”这个条件是根本不可能的,我…

网站建设创客下载应用商店app下载安装

幻兽帕鲁服务器价格多少钱?4核16G服务器Palworld官方推荐配置,阿里云4核16G服务器32元1个月、96元3个月,腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月,8核32G22M配置115元1个月、345元3个月,16核64G3…

深圳网站建设推荐q479185700顶上先用ps后用dw做网站

随着温室气体排放量的增大和温室效应的增强,全球气候变化问题受到日益的关注。我国政府庄严承诺在2030和2060年分别达到“碳达峰”和“碳中和”,因此气候变化和碳排放已经成为科研人员重点关心的问题之一。气候变化问题不仅仅是科学的问题,同…

做网站论坛赚钱关于网站建设的调查问卷

MySQL 存储过程 优点缺点一、存储过程的创建和调用创建存储过程实例1、in 输入参数2、out输出参数3、inout输入参数 三、变量1. 变量定义2. 变量赋值3. 用户变量 四、注释MySQL存储过程的调用MySQL存储过程的查询MySQL存储过程的修改MySQL存储过程的删除MySQL存储过程的控制语句…