网盘文件下载功能实现详解
创作时间:
作者:
@小白创作中心
网盘文件下载功能实现详解
引用
CSDN
1.
https://blog.csdn.net/wjl990316fddwjl/article/details/138212006
本文主要讲解网盘文件操作的下载文件部分,具体步骤如下:
目录
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状态
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、在桌面查看是否成功下载
发现桌面有哦
成功!!!!!!!!
热门推荐
诗评:杜牧一首即景诗,千古流传,人生婉转都在清明的思绪中弥散
春游江淮|皇藏天门一日游·探秘灵秀古奇景
VPS购买指南:该买什么配置,CPU核心数、内存和带宽怎么选?
心脏健康与胸痛应对:如何应对胸痛并维护心脏健康?
自制豆腐干的简易方法(独具特色的美食佳品,家庭实践不容错过)
贵州制造丨以煤为基 链上逐新 盘州大力发展能矿装备产业集群
阅读理解能力差?四招助你提升飞跃
剖析膝关节不同位置滑囊炎:解剖、病因、症状和检查
丹麦开放式三明治:北欧风情在舌尖的悠然绽放
5条安全要点你做到了几条?校园网络安全指南请收→
崂山公交之旅:经济、方便、快乐
VPS硬盘选择指南:HDD和SSD性能对比与最佳实践
《雪中悍刀行》人物角色介绍
三年一剑 涅槃归来 宝鸡青铜器博物院基本陈列“青铜铸文明”开展
深度解析:舌炎与口腔健康的紧密联系,你了解多少?
血压一会120一会150?这些原因需警惕
汽车燃油宝真的有用吗?揭秘燃油添加剂的实际效果
缓解喉咙痛的小妙招:饮食、饮水与生活习惯的综合建议
高效开展初中数学总复习课堂策略
“多动症”不能和调皮捣蛋画等号,“多动”孩子亟须社会更多关爱
夫妻义务及权利是什么
2025年4月美股暴跌综合分析:美国总统关税政策的“贸易炸弹”
一块豆腐的千年情缘
深圳全力打造全域支付示范区,境外人士也能刷外币卡坐深圳地铁啦!
沈姓的历史起源和名人简介
科普 | 家庭如何正确处理外科伤口?实用护理指南在此!
只有婴幼儿需要补充维生素D?错!看看最新指南怎么说
CKJ:慢性肾病患者肾功能下降与骨密度减少的关系
彩票中了500万,交完个税还要捐款,到手只剩300万?不捐款会怎样
专家科普:来自生命远古的感知——嗅觉