网盘—上传文件

本文主要讲解网盘里面关于文件操作部分的上传文件,具体步骤如下

目录

1、实施步骤:

2、代码实现

2.1、添加上传文件协议

2.2、添加上传文件槽函数

2.3、添加槽函数定义

2.4、关联上传槽函数

2.5、服务器端

2.6、在服务器端添加上传文件请求的case

2.7、客户端上传内容

2.8、添加定时器

2.9、关联信号槽

2.10、添加槽函数定义

2.11、打开服务器,接收上传文件内容

3、测试

A、点击上传文件,选择文件并打开

 B、提示上传成功

C、发现jack文件夹里面也有了makefile文件

D、大的文件也可以上传


1、实施步骤:

 A、客户端发送上传文件请求,请求包括:包括当前路径上传文件名上传文件内容

包括当前路径,上传文件名,这个时候不上传文件内容,当服务器接收到上传请求之后,在指定的路径下面,将该文件创建出来,客户端发送上传请求之后,上传文件内容。

B、服务器接收到客户端文件内容,将信息保存到之前创建的文件中,在服务器接受完上传的内容之后,服务器发送信息给客户端

C、客户端接受回复信息并显示

2、代码实现

2.1、添加上传文件协议

    ENUM_MSG_TYPE_UPLOAD_FILE_REQUEST,  //上传文件请求ENUM_MSG_TYPE_UPLOAD_FILE_RESPOND,  //上传文件回复

2.2、添加上传文件槽函数

    //上传文件void uploadFile();

2.3、添加槽函数定义

void Book::uploadFile()
{//当前路径QString strCurPath = TcpClient::getinstance().curPath();//选择上传文件//QFileDialog::getOpenFileName();会弹出一个窗口来,类似于打开文件QString strUploadFilePath = QFileDialog::getOpenFileName();//qDebug()<<strUploadFilePath;//将名字提取出来if(!strUploadFilePath.isEmpty()){// aa/bb/cc 5 8int index = strUploadFilePath.lastIndexOf('/');QString strFileName =strUploadFilePath.right(strUploadFilePath.size()-index-1);//qDebug()<<strFileName;//将数据封装到PDU里面QFile file(strUploadFilePath);qint64 filesize = file.size();//获得文件大小PDU *pdu =mkPDU(strCurPath.size()+1);pdu->uiMsgType=ENUM_MSG_TYPE_UPLOAD_FILE_REQUEST;memcpy(pdu->caMsg, strCurPath.toStdString().c_str(),strCurPath.size());//"%s %lld" %s文件名 lld文件大小long long 64sprintf(pdu->caData,"%s %lld", strFileName.toStdString().c_str(),filesize);//发送//发送给服务器TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);free(pdu);pdu=NULL;}else {QMessageBox::warning(this, "上传文件","上传文件名字不能为空!");}}

2.4、关联上传槽函数

    //关联上传文件信号槽connect(m_pUpLoadPB,SIGNAL(clicked(bool)),this, SLOT(uploadFile()));

2.5、服务器端

添加私有成员

 QFile m_file;//文件总的大小qint64 m_iTotal;qint64 m_iReceived;//每一次接受了多少文件bool m_bUpload; //现在处于上传文件状态还是其他状态

2.6、在服务器端添加上传文件请求的case

case ENUM_MSG_TYPE_UPLOAD_FILE_REQUEST:{char caFileName[32] = {'\0'};qint64  fileSize =0;//将文件名字提取出来sscanf(pdu->caData, "%s %lld", caFileName,&fileSize);//产生一块空间,将传过来的路径拷贝出来char *pPath = new char[pdu->uiMsgLen];memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);QString strPath = QString("%1/%2").arg(pPath).arg(caFileName);qDebug()<<strPath;//释放空间delete [] pPath;pPath = NULL;//根据拼接的路径将文件打开m_file.setFileName(strPath);//以只写的方式打开,如果这个文件不存在的话就会创建这个文件if(m_file.open(QIODevice::WriteOnly)){m_bUpload = true;m_iTotal =fileSize;m_iReceived = 0;}break;}

2.7、客户端上传内容

2.8、添加定时器

    //创建定时器void uploadFileData();    

2.9、关联信号槽

    //关联定时器信号槽connect(m_pTimer,SIGNAL(timeout()),this, SLOT(uploadFileData()));

2.10、添加槽函数定义

void Book::uploadFileData()
{m_pTimer->stop();//先关了,要不然他会重新计时QFile file(m_strUploadFilePath);if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"上传文件", "打开文件失败");return;}char *pBuffer = new char[4096];qint64 ret =0;while (true) {ret = file.read(pBuffer,4096);if(ret>0&&ret<=4096){//读到了数据TcpClient::getinstance().getTcpSocket().write(pBuffer,ret);}else if(0==ret){//数据已经读到了末尾了break;}else {QMessageBox::warning(this, "上传文件", "上传文件失败,读文件失败");break;}}file.close();delete [] (pBuffer);pBuffer=NULL;
}
void Book::uploadFile()
{//当前路径QString strCurPath = TcpClient::getinstance().curPath();//选择上传文件//QFileDialog::getOpenFileName();会弹出一个窗口来,类似于打开文件m_strUploadFilePath = QFileDialog::getOpenFileName();//qDebug()<<strUploadFilePath;//将名字提取出来if(!m_strUploadFilePath.isEmpty()){// aa/bb/cc 5 8int index = m_strUploadFilePath.lastIndexOf('/');QString strFileName =m_strUploadFilePath.right(m_strUploadFilePath.size()-index-1);//qDebug()<<strFileName;//将数据封装到PDU里面QFile file(m_strUploadFilePath);qint64 filesize = file.size();//获得文件大小PDU *pdu =mkPDU(strCurPath.size()+1);pdu->uiMsgType=ENUM_MSG_TYPE_UPLOAD_FILE_REQUEST;memcpy(pdu->caMsg, strCurPath.toStdString().c_str(),strCurPath.size());//"%s %lld" %s文件名 lld文件大小long long 64sprintf(pdu->caData,"%s %lld", strFileName.toStdString().c_str(),filesize);//发送//发送给服务器TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);free(pdu);pdu=NULL;//添加一个定时器防止数据粘连m_pTimer->start(1000);}else {QMessageBox::warning(this, "上传文件","上传文件名字不能为空!");}
}

2.11、打开服务器,接收上传文件内容

        //接收数据PDU *respdu = NULL;respdu =mkPDU(0);respdu->uiMsgType = ENUM_MSG_TYPE_UPLOAD_FILE_RESPOND;QByteArray buff = readAll();//接收读到的数据m_file.write(buff);//将读到的数据写道buff里面去m_iReceived+=buff.size();if(m_iTotal==m_iReceived){//接收数据结束了m_file.close();m_bUpload = false;strcpy(respdu->caData,UPLOAD_FILE_OK);//发送给客户端write((char*)respdu, respdu->uiPDULen);free(respdu);respdu =NULL;}else if ((m_iTotal<m_iReceived)){m_file.close();m_bUpload = false;strcpy(respdu->caData,UPLOAD_FILE_FAILED);//发送给客户端write((char*)respdu, respdu->uiPDULen);free(respdu);respdu =NULL;}}
}

2.12、客户端处理

        //---------------------上传文件------------------------case ENUM_MSG_TYPE_UPLOAD_FILE_RESPOND:{        QMessageBox::information(this,"进入文件夹",pdu->caData);break;}  

3、测试

A、点击上传文件,选择文件并打开

 B、提示上传成功

C、发现jack文件夹里面也有了makefile文件

D、大的文件也可以上传

成功!!!!!!!!!!!

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

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

相关文章

算法学习(5)-图的遍历

目录 什么是深度和广度优先 图的深度优先遍历-城市地图 图的广度优先遍历-最少转机 什么是深度和广度优先 使用深度优先搜索来遍历这个图的过程具体是&#xff1a; 首先从一个未走到过的顶点作为起始顶点&#xff0c; 比如以1号顶点作为起点。沿1号顶点的边去尝试访问其它未…

提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票

引言 五一假期作为中国的传统节日&#xff0c;也是旅游热门的时段之一&#xff0c;特价机票往往成为人们关注的焦点。在这个数字化时代&#xff0c;利用爬虫技术获取特价机票信息已成为一种常见的策略。通过结合C#和Fizzler库&#xff0c;我们可以更加高效地实现这一目标&…

2024年---蓝桥杯网络安全赛道部分WP

一、题目名称&#xff1a;packet 1、下载附件是一个流量包 2、用wireshark分析&#xff0c;看到了一个cat flag的字样 3、追踪http数据流&#xff0c;在下面一行看到了base64编码。 4、解码之后得到flag 二、题目名称&#xff1a;cc 1、下载附件&#xff0c;打开是一个html …

Docker构建LNMP部署WordPress

前言 使用容器化技术如 Docker 可以极大地简化应用程序的部署和管理过程&#xff0c;本文将介绍如何利用 Docker 构建 LNMP 环境&#xff0c;并通过部署 WordPress 来展示这一过程。 目录 一、环境准备 1. 项目需求 2. 安装包下载 3. 服务器环境 4. 规划工作目录 5. 创…

CAPS Wizard for Mac:打字输入辅助应用

CAPS Wizard for Mac是一款专为Mac用户设计的打字输入辅助应用&#xff0c;以其简洁、高效的功能&#xff0c;为用户带来了全新的打字体验。 CAPS Wizard for Mac v5.3激活版下载 该软件能够智能预测用户的输入内容&#xff0c;实现快速切换和自动大写锁定&#xff0c;从而大大…

OmniReader Pro for Mac:强大且全面的阅读工具

OmniReader Pro for Mac是一款专为Mac用户设计的强大且全面的阅读工具&#xff0c;它集阅读、编辑、管理等多种功能于一身&#xff0c;为用户提供了卓越的阅读体验。 OmniReader Pro for Mac v2.9.5激活版下载 该软件支持多种文件格式的阅读&#xff0c;包括PDF、Word、Excel、…

pycharm配置wsl开发环境(conda)

背景 在研究qanything项目的过程中&#xff0c;为了进行二次开发&#xff0c;需要在本地搭建开发环境。然后根据文档说明发现该项目并不能直接运行在windows开发环境&#xff0c;但可以运行在wsl环境中。于是我需要先创建wsl环境并配置pycharm。 wsl环境创建 WSL是“Windows Su…

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

1、《一本书讲透 Elasticsearch》销售最近进展汇报 给大家同步一下《一本书讲透 Elasticsearch》图书的进展情况&#xff0c;本周五&#xff08;2024年4月26日&#xff09;&#xff0c;出版社编辑老师反馈图书相关销量进展&#xff1a; 预计全网销量 1000 册&#xff0c;发货量…

OpenHarmony语言基础类库【@ohos.xml (xml解析与生成)】

将XML文本转换为JavaScript对象、以及XML文件生成和解析的一系列接口。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import xml from ohos.xml; XmlSerializer XmlSerializer接口…

FPGA实现图像处理之【直方图均衡-寄存器版】

FPGA实现直方图统计 一、图像直方图统计原理 直方图的全称为灰度直方图&#xff0c;是对图像每一灰度间隔内像素个数的统计。即对一张图片中每隔二灰度值的像素数量做统计&#xff0c;然后以直方图的形式展现出来。图下的亮暗分布在直方图中就可以一目了然&#xff0c;直方图…

Spark核心名词解释与编程

Spark核心概念 名词解释 1)ClusterManager&#xff1a;在Standalone(上述安装的模式&#xff0c;也就是依托于spark集群本身)模式中即为Master&#xff08;主节点&#xff09;&#xff0c;控制整个集群&#xff0c;监控Worker。在YARN模式中为资源管理器ResourceManager(国内…

paddlehub的简单应用

1、下载安装 pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple 报错&#xff1a; Collecting onnx<1.9.0 (from paddle2onnx>0.5.1->paddlehub)Using cached https://pypi.tuna.tsinghua.edu.cn/packages/73/e9/5b953497c0e36df589fc60cc6c6b35…

Redux数据流架构

Redux的难点是理解它对于数据修改的规则, 下图动态展示了在整个数据的修改中&#xff0c;数据的流向 Redux代码被分为三个核心的概念&#xff0c;三个概念分别是: state: 一个对象 存放着我们管理的数据action: 一个对象 用来描述你想怎么改数据reducer: 一个函数 根据action的…

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结&#xff1a; 前言 目前除了巨帧处理逻辑之外&#xff0c;所有的准备工作都已经结束了&#xff0c;先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式&#xff0c;其中…

用Jenkins实现cherry-pick多个未入库的gerrit编译Android固件

背景: 在做Android固件开发的时候,通常我们可以利用gerrit-trigger插件,开发者提交一笔的时候自动触发jenkins编译,如果提交的这一笔的编译依赖其他gerrit才能编译过,我们可以在commit message中加入特殊字段,让jenkins在编译此笔patch的时候同时抓取依赖的gerrit代码下…

java后端项目:视积分抽奖平台

一、项目背景: 本次抽奖系统实现是在视频中内置一个线上活动抽奖系统,奖品是在一个时间段区间内均匀发布,用户可以在这个时间段内参与抽奖。 二、项目架构 活动抽奖平台采用微服务架构来完成,在功能上实现拆分为用户、网关、以及抽奖微服务,其中用户、网关是后台项目通…

三. TensorRT基础入门-TensorRT内部的优化模块

目录 前言0. 简述1.TensorRT的优化策略2. Layer Fusion3. Kernel Auto-Tuning4. Quantization总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第三章—TensorRT 基础入…

C++ | 类和对象(上)

目录 什么是类 类的介绍 struct在两种语言中的有何区别 私有变量命名注意点 类的作用域 类的声明定义分离 类的访问限定符 封装 类的实例化 类对象的存储 this指针 一道this指针相关的王炸题&#xff1a; 结语 什么是类 类的介绍 我们举一个日常生活中的例子&…

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

C之·标准库<string.h>

系列文章目录 文章目录 前言一、字符串分割函数1.strtok()2. 总结 前言 <stdlib.h> 是C语言中的一个头文件&#xff0c;提供了一系列用于操作字符串的函数。例如查找子字符串、拼接字符串、比较字符串等等。为了方便开发者进行字符串操作&#xff0c;C语言提供了一个标准…