网盘—下载文件

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

目录

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; 子域名信息收…

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

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

YOLOv8核心原理深度解析

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

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;并减少由于缺陷产品导致的潜…

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上的数据不再存在。 不过不用…

Spark SQL编程初级实践

参考链接 Spark编程: Spark SQL基本操作 2020.11.01_df.agg("age"->"avg")-CSDN博客 RDD编程初级实践-CSDN博客 Spark和Hadoop的安装-CSDN博客 1. Spark SQL基本操作 { "id":1 , "name":" Ella" , "age":…

使用多网络和Kubernetes转变您的通讯应用程序

传统的 Kubernetes 网络在基本的 Pod 到 Pod 连接方面表现出色&#xff0c;但在满足通讯工作负载的安全性、性能和合规性要求时可能存在不足。这限制了通讯提供商充分利用 Kubernetes 的可扩展性和敏捷性优势的能力。 Google Cloud 的多网络方法使通讯提供商能够克服这些限制&a…

笔记-PPT绘图导出高清无失真图片

问题描述&#xff1a;PPT绘图已经用了高清图&#xff08;jpg、tif格式&#xff09;&#xff0c;但论文图片还是不清晰&#xff0c;打印出来还是有点糊 以下是PPT导出高清不失真图片&#xff08;emf格式&#xff09;的具体描述。 目录 一、绘图工具二、操作步骤 一、绘图工具 …

数据挖掘之基于Lightgbm等多模型消融实验的信用欺诈检测实现

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当前的金融环境中&#xff0c;信用欺诈行为日益增多&#xff0c;给金融机构和消费者带来了巨大的损…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…

Spring Boot的热部署工具“AND”Swagger测试工具

Spring Boot的热部署&Swagger测试页面的使用 热部署指的是在项目无需重启的情况下&#xff0c;只需要刷新页面&#xff0c;即可获得已经修改的样式或功能。要注意该工具一般用于开发环境&#xff0c;在生产环境中最好不要添加这个工具。 对于无需重启便可刷新这么方便的工…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统&#xff1a;2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑&#xff1a;4. Windows上安装VScode链接ubuntu系统&#xff0c;进行远程开发&#xff1a; 1. 安装虚…

理解sourcemap:调试和部署的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

根据顶层的id递归查询出全部子节点

效果图 根据输入的id为2查询出所有的红色框起来的节点 mapper接口 TSystemOrg getOrgByorgId(String orgId); List<TSystemOrg> getOrgListByParentId(String parentId);mapper.xml <!--根据id查询org--> <select id"getOrgByorgId" resultType&…

【JVM】简述类加载器及双亲委派机制

双亲委派模型&#xff0c;是加载class文件的一种机制。在介绍双亲委派模型之前&#xff0c;我需要先介绍几种类加载器&#xff08;Class Loader&#xff09;。 1&#xff0c;类加载器 Bootstrap&#xff0c;加载lib/rt.jar&#xff0c;charset.jar等中的核心类&#xff0c;由…