C++学习之网盘项目单例模式

news2025/3/24 19:05:15

目录

1.知识点概述

2.单例介绍

3.单例饿汉模式

4.饿汉模式四个版本

5.单例类的使用

6.关于token的作用和存储

7.样式表使用方法

8.qss文件中选择器介绍

9.qss文件样式讲解和测试

10.qss美化登录界面补充

11.QHTTPMULTIPART类的使用

12.文件上传协议

13.文件上传协议

14.QT中散列值的计算

15.设定nginx接受的最大文件上限


1.知识点概述

1.1 选择器类型
选择器
示例
说明
通用选择
*
匹配所有部件 匹配当前窗口所有的子窗口
类型选择
QWidget
匹配 QWidget 及其子类窗口的实例
类选择器
.QPushButton
匹配 QPushButton 的实例,但不包含子类。相当于 *
[class~=”QPushButton”]
ID 选择器
QPushButton#okButton
匹配所有 objectName okButton QPushButton 实例。
后代选择
QDialog QPushButton
匹配属于 QDialog 后代(孩子,孙子等)的 QPushButton 所有实
例。
子选择器
QDialog >QPushButton
匹配属于 QDialog 直接子类的 QPushButton 所有实例。
1.2 QSS 的使用步骤
1.3 登录窗口设置
1. 添加一个新文件 , 文件后缀 . qss
- 位置 : 项目文件 xxx . pro 同一级 , 或者更深的目录中
- 添加注释 : 使用 /**/
2. qss 文件编码格式 , 必须是 utf - 8
3. 编写 qss 文件 , 给对应的控件设置样式
4. qss 加载到程序中
- 使用 QFile 将文件内容读到内存 , 得到了一个字符串
- 需要将这个字符串对应的样式设置给当前应用程序的对象
- QApplication 对象
- key 使用 qApp 全局指针进行访问 , 指向 QApplication 对象
- 设置方式 : setStyleSheet ( QString style )
5. qss 添加到资源文件中

2.单例介绍

2.1 常用的四种方式
application/x-www-form-urlencoded
application/json
text/xml
multipart/form-data
/* 登录窗口设置背景图片 */
/* 登录窗口所有控件设置字体 , 字体大小 */
/* 设置登录 / 注册 / 服务器设置窗口标题字体 , 字体大小 */
/* 设置 logo 显示的图片 */
/* 设置窗口标题字体 , 字体大小 , 加粗 */
/* 没有账号马上注册按钮 : 字体颜色和添加下划线 */
/* 登录 / 注册 /OK 按钮 : 字体颜色 , 宽度 , 高度 , 字体大小 , 显示图片 */
/* 标题栏按钮 : normal, hover, press 三种状态切换 */
1
2
3
4
5
6
7
8
# 请求行
POST http: //www.example.com HTTP/1.1
# 请求头
Content-Type: application/x-www-form-urlencoded;charset=utf-8
# 空行
# 请求数据 ( 向服务器提交的数据 )
title=test&user=kevin&passwd=32222
1
2
3
4
5
6
7
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title": "test","sub":[1,2,3]}
1
2
3
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0" encoding="utf8"?>
<methodcall>
<methodname color="red">examples.getStateName</methodname>
<params>
<value><i4>41</i4></value>
</params>
</methodcall>
1
2
3
4
5
6
7
8
9 2.2 multipart/form-data
1. QHttpPart
2. QHttpMultiPart
3. 上传协议
1. 秒传
客户端
POST http://www.example.com HTTP/1.1
Content-Type: multipart/form-data
# 发送的数据
------WebKitFormBoundaryPpL3BfPQ4cHShsBz \r\n
Content-Disposition: form-data; name="file"; filename="qw.png"; md5="xxxxxxxxxx"
Content-Type: image/png\r\n;
\r\n
............. 文件内容 ................
............. 文件内容 ................
------WebKitFormBoundaryPpL3BfPQ4cHShsBz--
1
2
3
4
5
6
7
8
9
10
// 设置头信息
void QHttpPart::setHeader ( QNetworkRequest::KnownHeaders header , const QVariant & value )
// 设置数据
void QHttpPart::setBody ( const QByteArray & body )
void QHttpPart::setBodyDevice ( QIODevice * device )
1
2
3
4
5
QHttpMultiPart::QHttpMultiPart ( ContentType contentType , QObject * parent = Q_NULLPTR )
- 参数 contentType : QHttpMultiPart::FormDataType
void QHttpMultiPart::append ( const QHttpPart & httpPart )
- 参数 httpPart : 初始化好的数据块对象
QByteArray QHttpMultiPart::boundary () const
- 返回值 : 数据格式中的分界线
// 自己指定分界线 , 一般情况下不需要
void QHttpMultiPart::setBoundary ( const QByteArray & boundary )

3.单例饿汉模式

4.饿汉模式四个版本

5.单例类的使用

6.关于token的作用和存储

上传协议
1. 秒传
客户端
POST http://www.example.com HTTP/1.1
Content-Type: multipart/form-data
# 发送的数据
------WebKitFormBoundaryPpL3BfPQ4cHShsBz \r\n
Content-Disposition: form-data; name="file"; filename="qw.png"; md5="xxxxxxxxxx"
Content-Type: image/png\r\n;
\r\n
............. 文件内容 ................
............. 文件内容 ................
------WebKitFormBoundaryPpL3BfPQ4cHShsBz--
1
2
3
4
5
6
7
8
9
10
// 设置头信息
void QHttpPart::setHeader ( QNetworkRequest::KnownHeaders header , const QVariant & value )
// 设置数据
void QHttpPart::setBody ( const QByteArray & body )
void QHttpPart::setBodyDevice ( QIODevice * device )
1
2
3
4
5
QHttpMultiPart::QHttpMultiPart ( ContentType contentType , QObject * parent = Q_NULLPTR )
- 参数 contentType : QHttpMultiPart::FormDataType
void QHttpMultiPart::append ( const QHttpPart & httpPart )
- 参数 httpPart : 初始化好的数据块对象
QByteArray QHttpMultiPart::boundary () const
- 返回值 : 数据格式中的分界线
// 自己指定分界线 , 一般情况下不需要
void QHttpMultiPart::setBoundary ( const QByteArray & boundary )
-
1
2
3
4
5
6
7
8
9
# url
http: //127.0.0.1:80/md5
# post 数据格式
{
user:xxxx,
token:xxxx,
md5:xxx,
fileName: xxx
}
1
2
3
4
5
6
7
8
9 文件已存在 ( 秒传成功 )
{"code":"005"}
秒传成功:
{"code":"006"}
秒传失败:
{"code":"007"}
服务器
2. 上传
客户端
成功
{"code":"008"}
失败
{"code":"009"}
服务器
Nginx 设置
服务器端 fastCGI 部分 代码
# url
http: //127.0.0.1:80/upload
# post 数据格式
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user="mike"; filename="xxx.jpg"; md5="xxxx";
size=10240
Content-Type: text/plain
真正的文件内容
------WebKitFormBoundary88asdgewtgewx--
1
2
3
4
5
6
7
8
# nginx 将数据转发给对应的 fastCGI 程序
location / upload
{
fastcgi_pass 地址 :port;
include fastcig.conf;
}
# 重新加载 nginx 配置文件
sudo nginx -s reload
// 取出 Content-Disposition 中的键值对的值 , 并得到文件内容 , 并将内容写入文件
int recv_save_file ( char * user , char * filename , char * md5 , long * p_size )
{
int ret = 0 ;
char * file_buf = NULL ;
char * begin = NULL ;
char * p , * q , * k ;
8 char content_text [ 512 ] = { 0 }; // 文件头部信息
char boundary [ 512 ] = { 0 }; // 分界线信息
//==========> 开辟存放文件的 内存 <===========
file_buf = ( char * ) malloc ( 4096 );
if ( file_buf == NULL )
{
return - 1 ;
}
// 从标准输入 (web 服务器 ) 读取内容
int len = fread ( file_buf , 1 , 4096 , stdin );
if ( len == 0 )
{
ret = - 1 ;
free ( file_buf );
return ret ;
}
//===========> 开始处理前端发送过来的 post 数据格式 <============
begin = file_buf ; // 内存起点
p = begin ;
/*
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user="mike"; filename="xxx.jpg";
md5="xxxx"; size=10240\r\n
Content-Type: application/octet-stream\r\n
------WebKitFormBoundary88asdgewtgewx--
*/
//get boundary 得到分界线 , ------WebKitFormBoundary88asdgewtgewx
p = strstr ( begin , "\r\n" );
if ( p == NULL )
{
ret = - 1 ;
free ( file_buf );
return ret ;
}
// 拷贝分界线
strncpy ( boundary , begin , p - begin );
boundary [ p - begin ] = '\0' ; // 字符串结束符
p += 2 ; //\r\n
// 已经处理了 p-begin 的长度
len -= ( p - begin );
//get content text head
begin = p ;
//Content-Disposition: form-data; user="mike"; filename="xxx.jpg"; md5="xxxx";
size=10240\r\n
p = strstr ( begin , "\r\n" );
if ( p == NULL )
59 {
ret = - 1 ;
free ( file_buf );
return ret ;
}
strncpy ( content_text , begin , p - begin );
content_text [ p - begin ] = '\0' ;
p += 2 ; //\r\n
len -= ( p - begin );
//======================================== 获取文件上传者
//Content-Disposition: form-data; user="mike"; filename="xxx.jpg"; md5="xxxx";
size=10240\r\n
q = begin ;
q = strstr ( begin , "user=" );
q += strlen ( "user=" );
q ++ ; // 跳过第一个 "
k = strchr ( q , '"' );
strncpy ( user , q , k - q ); // 拷贝用户名
user [ k - q ] = '\0' ;
//======================================== 获取文件名字
//"; filename="xxx.jpg"; md5="xxxx"; size=10240\r\n
begin = k ;
q = begin ;
q = strstr ( begin , "filename=" );
q += strlen ( "filename=" );
q ++ ; // 跳过第一个 "
k = strchr ( q , '"' );
strncpy ( filename , q , k - q ); // 拷贝文件名
filename [ k - q ] = '\0' ;
//======================================== 获取文件 MD5
//"; md5="xxxx"; size=10240\r\n
begin = k ;
q = begin ;
q = strstr ( begin , "md5=" );
q += strlen ( "md5=" );
q ++ ; // 跳过第一个 "
k = strchr ( q , '"' );
strncpy ( md5 , q , k - q ); // 拷贝文件名
md5 [ k - q ] = '\0' ;
//======================================== 获取文件大小
//"; size=10240\r\n
begin = k ;
q = begin ;
q = strstr ( begin , "size=" );
q += strlen ( "size=" );
k = strstr ( q , "\r\n" );
char tmp [ 256 ] = { 0 };
strncpy ( tmp , q , k - q ); // 内容
111 使用 fastCGI 管理器启动 fastCGI 程序
4. Http 上传下载进度
tmp [ k - q ] = '\0' ;
* p_size = strtol ( tmp , NULL , 10 ); // 字符串转 long
begin = p ;
p = strstr ( begin , "\r\n" );
p += 2 ; //\r\n
len -= ( p - begin );
// 下面才是文件的真正内容
/*
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user="mike"; filename="xxx.jpg";
md5="xxxx"; size=10240\r\n
Content-Type: application/octet-stream\r\n
真正的文件内容 \r\n
------WebKitFormBoundary88asdgewtgewx--
*/
// begin 指向正文首地址
begin = p ;
// 将文件内容抠出来
// 文件内容写如本地磁盘文件
free ( file_buf );
return ret ;
}
spawn-fcgi -a IP 地址 -p 端口 -f ./fastcgi 程序
- 提示启动失败
- ldd fastCGI 程序

7.样式表使用方法

8.qss文件中选择器介绍

9.qss文件样式讲解和测试

10.qss美化登录界面补充

11.QHTTPMULTIPART类的使用

12.文件上传协议

13.文件上传协议

14.QT中散列值的计算

15.设定nginx接受的最大文件上限

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

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

相关文章

Apache Flink技术原理深入解析:任务执行流程全景图

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 思维导图 📌 引言 Apache Flink 作为一款高性能的分布式流处理引擎,其内部执行机制精妙而复杂。本文将…

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

嘿&#xff0c;亲爱的算法工程师们&#xff01;今天咱们聊一聊PDF解析的那些事儿&#xff0c;简直就像是在玩一场“信息捉迷藏”游戏&#xff01;PDF文档就像是个调皮的小精灵&#xff0c;表面上看起来规规矩矩&#xff0c;但当你想要从它那里提取信息时&#xff0c;它就开始跟…

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

GpuGeek:破解算力难题,赋能AI创新与普及

文章目录 一、引言二、填补算力资源供需缺口&#xff0c;降低使用门槛三、提升算力资源利用率&#xff0c;推动高效协作四、满足多样化需求&#xff0c;支持AI技术落地五、推动算力市场创新&#xff0c;促进生态良性发展六、助力AI人才培养&#xff0c;推动行业长远发展七、结语…

扣子平台知识库不能上传成功

扣子平台知识库不能上传成功 目录 扣子平台知识库不能上传成功查看模板复制头部到自己的excel中json数据转为excel或者csv&#xff08;一定使用excel&#xff0c;csv总是报错&#xff09; 查看模板复制头部到自己的excel中 json数据转为excel或者csv&#xff08;一定使用excel&…

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…

c++进阶之------红黑树

一、概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡二叉查找树&#xff0c;它在计算机科学的许多领域中都有广泛应用&#xff0c;比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性&#xff08;红色或黑色&am…

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply

《数据库原理》SQLServer期末复习_题型+考点

目录 题型&#xff1a; 一. 概况分析题&#xff08;5小题&#xff0c;每小题2分&#xff0c;共10分&#xff09; 二. 计算题&#xff08;3小题&#xff0c;每小题5分&#xff0c;共15分&#xff09; 三. 数据库设计&#xff08;2小题&#xff0c;每小题10分&#xff0c;共2…

Zstd(Zstandard)压缩算法

要压缩的数据量越小&#xff0c;压缩的难度就越大。这个问题对所有压缩算法都是通用的&#xff0c;原因是压缩算法从过去的数据中学习如何压缩未来的数据。但是&#xff0c;在新数据集开始时&#xff0c;没有“过去”可以构建。 官网 为了解决这种情况&#xff0c;Zstd 提供了一…

本地部署 browser-use

本地部署 browser-use 0. 引言1. 核心功能与优势2. 快速上手3. 部署 Gradio UI4. 更多示例0. 引言 Browser-Use 是一个强大的工具,旨在让 AI Agent 能够控制浏览器,从而实现各种自动化任务。它简化了 AI 与浏览器的交互,让开发者能够轻松构建能够执行网页操作的智能应用。本…

Vite管理的Vue3项目中monaco editer的使用以及组件封装

文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor&#xff0c;但是因为自身能力问题&#xff0c;读不懂官网文档&#xff0c;最终结合ai和网友的帖子成功引入&…

[笔记] TinyWebServer编译及demo运行过程

文章目录 前言环境搭建ubuntumysql 8.0c/c开启root用户TinyWebServer 搭建及编译过程运行结果常见问题./threadpool/../CGImysql/sql_connection_pool.h:6:10: fatal error: mysql/mysql.h: No such file or directory./server运行后直接退出了 前言 哎 也就帮帮新手看看问题 …

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及&#xff0c;势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营&#xff0c;互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容&#xff0c;再加上电影行业的发展&#xff0c;如此繁荣吸引…

虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用

一、微服务注册中心Consul 编写完延迟任务系统的web层接口&#xff0c;也就是说可以基于http协议来访问延迟系统&#xff0c;接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现&#xff0c;服务的注册与发现都离不开服务的注册中心&#xff0c;本项目选取…

数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记

一、书籍核心价值与定位 1.1 书籍概述:中国联通研究院的权威之作 《算力网络 —— 云网融合 2.0 时代的网络架构与关键技术》由中国联通研究院算力网络攻关团队精心撰写,是业界首部系统性探讨云网融合 2.0 与算力网络的专著。在云网融合从 1.0 迈向 2.0 的关键节点,本书的…

第十六届蓝桥杯康复训练--6

题目链接&#xff1a;790. 数的三次方根 - AcWing题库 思路&#xff1a;二分&#xff0c;注意正负号和小数判断退出的方法&#xff08;虽然正负无所谓&#xff09; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#define exs 0.00000018812716007232667…

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…