网盘—下载文件

本文主要讲解网盘文件操作的下载文件部分,具体步骤如下:

目录

1、实施步骤

2、代码实现

2.1、添加下载文件的协议

2.2、添加下载文件函数

2.3、添加信号槽

2.4、实现槽函数

2.5、设置download状态

2.6、添加定义

2.7、服务器接收数据

2.8、添加下载文件的case

2.9、测试——看一下客户端是否可以得到文件名和大小

A、点击下载文件,保存在桌面

B、终端输出,文件名字和大小

2.10、提取文件名和大小

2.11、收数据

2.12、服务器怎么发数据

2.12、发送文件给客户端

2.13、定义定时器,关联信号槽

2.14、发送文件给客户端

3、测试

3.1、点击需要下载的文件

3.2、选择保存路径已经名称 叫做testt.h

3.3、在桌面查看是否成功下载


1、实施步骤

A、客户端发送下载请求(请求包含路径,下载文件名)

B、服务器提取指定内容以及文件大小发送给客户端

C、客户端循环接收服务器发送过来的文件内容,保存到文件中(客户端需要指定一个位置来保存我们接收到的文件内容,QFileDialog)

2、代码实现

2.1、添加下载文件的协议

    ENUM_MSG_TYPE_DOWNLOAD_FILE_REQUEST,  //下载文件请求ENUM_MSG_TYPE_DOWNLOAD_FILE_RESPOND,  //下载文件回复

2.2、添加下载文件函数

    //下载文件void downloadFile();

2.3、添加信号槽

    //关联下载文件槽函数connect(m_pDownLoadPB, SIGNAL(clicked(bool)),this, SLOT(downloadFile()));

2.4、实现槽函数

void Book::downloadFile()
{//获得下载的文件名字//获得当前所在的目录QString strCurPath = TcpClient::getinstance().curPath();//获得点击删除的文件QListWidgetItem *pItem =  m_pBookListW->currentItem();//判断if(NULL==pItem){QMessageBox::warning(this,"下载文件","请选择要下载的文件");}else{//可能还没有输入路径的时候就已经回复了,所以放在前面        //定义存放位置QString strSaveFilePath = QFileDialog::getSaveFileName();if(strSaveFilePath.isEmpty()){QMessageBox::warning(this, "下载文件","请指定要保存的位置");strSaveFilePath.clear();}else {m_strSaveFilePath = strSaveFilePath;}//当前网盘所在的路径QString strCurPath = TcpClient::getinstance().curPath();PDU *pdu =mkPDU(strCurPath.size()+1);pdu->uiMsgType=ENUM_MSG_TYPE_DOWNLOAD_FILE_REQUEST;//文件名字QString strFileName = pItem->text();strncpy((char*)(pdu->caData),strFileName.toStdString().c_str(),strFileName.size());memcpy(pdu->caMsg,strCurPath.toStdString().c_str(),strCurPath.size());//发送给服务器TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);//可能还没有输入路径的时候就已经回复了}
}

2.5、设置download状态

    //设置download的状态void setDownloadStatus(bool status);

2.6、添加定义

void Book::setDownloadStatus(bool status)
{m_bDownload =status;
}

2.7、服务器接收数据

2.8、添加下载文件的case

           //-----------下载文件--------------------------case ENUM_MSG_TYPE_DOWNLOAD_FILE_REQUEST:{//先把路径名字得到char caFileName[32] = {'\0'};strcpy(caFileName,pdu->caData);//产生一块空间,将传过来的路径拷贝出来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;//服务器给回复//先发送一个大小QFileInfo fileinfo(strPath);qint64 filesize = fileinfo.size();PDU *respdu =mkPDU(0);respdu->uiMsgType = ENUM_MSG_TYPE_DOWNLOAD_FILE_RESPOND;sprintf(respdu->caData,"%s %lld",caFileName,filesize);//发送给客户端write((char*)respdu,respdu->uiPDULen);free(respdu);respdu = NULL;  break;}

2.9、测试——看一下客户端是否可以得到文件名和大小

        //---------------------下载文件文件------------------------case ENUM_MSG_TYPE_DOWNLOAD_FILE_RESPOND:{qDebug()<<pdu->caData;//QMessageBox::information(this,"下载文件",pdu->caData);break;}

A、点击下载文件,保存在桌面

B、终端输出,文件名字和大小

2.10、提取文件名和大小

        case ENUM_MSG_TYPE_DOWNLOAD_FILE_RESPOND:{qDebug()<<pdu->caData;//QMessageBox::information(this,"下载文件",pdu->caData);//定义文件的名字char caFileName[32] ={'\0'};sscanf(pdu->caData, "%s %lld", caFileName, &(OpeWidget::getInstance().getBook()->m_iTotal));if(strlen(caFileName)>0 &&OpeWidget::getInstance().getBook()->m_iTotal >0){OpeWidget::getInstance().getBook()->setDownloadStatus(true);//现在处于下载状态//打开文件m_file.setFileName(OpeWidget::getInstance().getBook()->getSaveFilePath());if(!m_file.open(QIODevice::WriteOnly)){QMessageBox::warning(this, "下载文件","获得保存文件的路径失败");   }}break;}

2.11、收数据

 else {//处于收数据的状态QByteArray buffer = m_tcpSocket.readAll();m_file.write(buffer);Book *pBook = OpeWidget::getInstance().getBook();pBook->m_Recived+=buffer.size();if(pBook->m_iTotal ==pBook->m_Recived){m_file.close();pBook->m_iTotal =0;pBook->m_Recived =0;pBook->setDownloadStatus(false);}else if(pBook->m_iTotal ==pBook->m_Recived) {//收到的数据比原本的数据还要大m_file.close();pBook->m_iTotal =0;pBook->m_Recived =0;pBook->setDownloadStatus(false);QMessageBox::critical(this, "下载文件","下载文件失败");}}

2.12、服务器怎么发数据

2.12、发送文件给客户端

//发送文件数据给客户端void sendFileToClient();

2.13、定义定时器,关联信号槽

    m_pTimer = new QTimer;    connect(m_pTimer, SIGNAL(timeout()), this, SLOT(sendFileToClient()));

2.14、发送文件给客户端

void MyTcpSocket::sendFileToClient()
{char *pData =new char[4096];qint64 ret =0;while (true) {ret = m_file.read(pData, 4096);if(ret>0 &&ret <=4096){write(pData,ret);}else if (0==ret) {//所有文件都读取出来,并且发送完了m_file.close();break;}else if (ret<0) {qDebug()<<"发送文件内容给客户端过程中失败";m_file.close();break;}}delete [] pData;pData = NULL;
}

3、测试

3.1、点击需要下载的文件

3.2、选择保存路径已经名称 叫做testt.h

3.3、在桌面查看是否成功下载

发现桌面有哦

成功!!!!!!!!

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

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

相关文章

计算机英文论文常见错误写作习惯2

目录 第一部分 非常长的句子 在一个句子的主要概念的前面&#xff0c;首先说明目的、地点或原因 将表示时间的短语放在句首的倾向 将最重要的主语放在句首&#xff0c;以示强调 ‘In this paper’, ‘in this study’ 第一部分 非常长的句子 由于作者经常直接从中文翻译…

【云原生】Docker 实践(三):使用 Dockerfile 文件构建镜像

Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerfile 文件构建镜像 1.使用 Dockerfile 文件构建镜像2.Dockerfile 文件详解 1.使用 Dockerfile 文件构建镜像 Dockerfile 是一个文本文件&#xff0c;其中包含了一条条的指令&#xff0c;每一条指令都用于构建镜像…

VSCode SSH连接远程主机失败,显示Server status check failed - waiting and retrying

vscode ssh连接远程主机突然连接不上了&#xff0c;终端中显示&#xff1a;Server status check failed - waiting and retrying 但是我用Xshell都可以连接成功&#xff0c;所以不是远程主机的问题&#xff0c;问题出在本地vscode&#xff1b; 现象一&#xff1a; 不停地输入…

39.WEB渗透测试-信息收集-域名、指纹收集(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;38.WEB渗透测试-信息收集-信息收集-企业信息收集&#xff08;5&#xff09; 子域名信息收…

事件处理模式--reactor原理与实现

文章目录 reactorapicode reactor reactor是是服务器的重要模型, 是一种事件驱动的反应堆模式 通过epoll_create() 创建句柄, epoll_ctrl()提前注册好不同的事件处理函数 , 当事件到来就由 epoll_wait () 获取同时到来的多个事件&#xff0c;并且根据数据的不同类型将事件分发…

java+jsp+Oracle+Tomcat 记账管理系统论文(一)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

laravel rabbitmq 队列

安装Laravel的RabbitMQ队列驱动&#xff1a; composer require vladimir-yuldashev/laravel-queue-rabbitmq env文件配置 #rabbitmq QUEUE_CONNECTIONrabbitmq #修改一下 RABBITMQ_HOST192.168.11.4 #要连接的主机名 RABBITMQ_PORT5671 #端口号 RABBITMQ_VHOST/…

自动化测试用例之元素自愈:Playwright与pytest的结合使用

前言 在自动化测试领域&#xff0c;元素定位的准确性对于测试的成功至关重要。当使用Playwright结合pytest进行测试时&#xff0c;我们可以通过一些策略来增强测试的鲁棒性&#xff0c;特别是在元素定位失败时能够自动进行修复。本文将详细介绍如何实现这一过程。 环境准备 …

ZooKeeper 搭建详细步骤之一(单机模式)

ZooKeeper 搭建详细步骤之三&#xff08;真集群&#xff09; ZooKeeper 搭建详细步骤之二&#xff08;伪集群模式&#xff09; ZooKeeper 搭建详细步骤之一&#xff08;单机模式&#xff09; ZooKeeper 及相关概念简介 搭建模式简述 ZooKeeper 的搭建模式包括单机模式、集群模…

Java jstat 基本使用 gc 查看,jstat -gcutil等

jstat&#xff08;Java Statistics Monitoring Tool&#xff09;是JDK自带的一个命令行工具&#xff0c;用于监视Java虚拟机&#xff08;JVM&#xff09;的各种运行时性能统计信息&#xff0c;如垃圾收集、内存使用情况等。它允许用户无需附加到目标Java进程中&#xff0c;即可…

YOLOv8核心原理深度解析

YOLOv8源码地址: https://github.com/ultralytics/ultralytics 一、简介: 根据官方描述,Yolov8是一个SOTA模型,它建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性,使其成为实现目标检测、图像分割、姿态估计等任务的最佳选择。其具体…

10种新兴网络安全威胁和攻击手法

网络攻击 第一 种新型勒索软件攻击 在当今互联网世界中&#xff0c;勒索软件已成为企业和个人面临的严峻威胁。根据Akamai发布的《互联网状态&#xff08;SOTI&#xff09;报告》&#xff0c;在不断发展的勒索软件环境中&#xff0c;攻击者正试图突破受害者的防御能力。与此同…

Vue3 + Element-plus 报错 require is not defined 处理问题

问题复现&#xff1a; yarn dev 后报错如下&#xff1a; app.js:358 Uncaught ReferenceError: require is not defined at eval (index.mjs:4:30) at Module../node_modules/element-plus/icons-vue/dist/es/index.mjs (chunk-vendors.js:9072:1) at webpack_require (app.j…

AI图书推荐:将 ChatGPT和Excel融合倍增工作效率

《将 ChatGPT和Excel融合倍增工作效率》&#xff08; Hands-on ChatGPT in Excel. Enhance Your Excel Workbooks&#xff09;由Mitja Martini撰写&#xff0c;旨在教授读者如何将ChatGPT与Excel结合使用&#xff0c;以提升工作效率和创造AI增强的Excel工具。它还提供了Excel中…

AnomalyGPT——使用大型视觉语言模型进行工业异常检测的算法解析与应用

1.概述 工业缺陷检测是工业自动化和质量控制中的一个重要环节&#xff0c;其目的是在生产过程中识别和分类产品或组件中的缺陷&#xff0c;以确保最终产品的质量满足既定标准。这项技术的应用可以显著提高生产效率&#xff0c;降低成本&#xff0c;并减少由于缺陷产品导致的潜…

Vue3 + TS + Element-Plus 封装的 Table 表格组件

代码中主要增加了3个插槽&#xff0c;operationsStart 从操作栏开头增加按钮&#xff0c;operationsStart 从操作栏结尾增加按钮&#xff0c;还有一个插槽用来自定义列的内容&#xff0c;就是 TableModel里面的Key <template><el-tableborderstripe:data"data&q…

sgg_ssm学习--前端搭建遇到的问题

目录 问题1&#xff1a;由于我是解压缩软件nodejs&#xff0c;没有添加系统路径 解决&#xff1a;添加nodejs的路径 到系统 path中 问题2&#xff1a;vscode 终端输入npm命令 报错 解决(如图所示在vscode打开前端工程&#xff0c;终端修改如下配置)&#xff1a; 问题1&…

如何在iPhone上恢复出厂设置后恢复数据

你不想让这种情况发生&#xff0c;但它确实发生了。您必须将iPhone恢复出厂设置。当您的 iPhone 上出现软件问题且无法修复时&#xff0c;可能会发生这种情况。相反&#xff0c;在更新期间&#xff0c;或者您的iPhone遇到问题时&#xff0c;iPhone上的数据不再存在。 不过不用…

利用R语言自带函数快速探索数据

《R Graphics Cookbook》 chapter2 Quickly Exploring Data 快速浏览数据 为了非常快速地浏览数据&#xff0c;有时使用 R 自带的绘图函数很有用 Creating a Scatter Plot 创建一个散点图 要制作散点图&#xff0c;请使用 plot() 并向其传递一个 x 值的向量&#xff0c;后跟一…

xcode 15.3 连接iphone 14PM真机提示 is not available because it is unpair

错误提示&#xff1a;iPhone 14PM is not available because it is unpaired&#xff0c;Pair with the device in the XcodeDevices Window, and respond to anypairing prompts on the device. 1、退出XCode,断开连接设备 2 、在终端执行 sudo pkill usbmuxd 3 、重新打开x…