网盘—上传文件

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

目录

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,一经查实,立即删除!

相关文章

JAVA:后端框架-将servlet+jsp改为springboot+jsp需要做什么

目录 POJO&#xff08;作为实体&#xff09;&#xff1a; 添加注释Entity Id DAO&#xff08;作为存储库&#xff09;&#xff1a;使用Spring Boot时&#xff0c;不需要具体的DAO实现或JdbcUtils COMMON&#xff08;应用配置&#xff09;&#xff1a;JdbcUtils 与 JdbcTempla…

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

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

TensorFlow轻松入门(二)——小案例:ANN构建一个异或运算的模型

异或运算&#xff1a; 位与位进行比较&#xff0c;相同则结果为0&#xff1b;不同则结果为1。 实现步骤 构建Feature与Label数据 创建顺序模型 指定模型的第一层&#xff0c;线性模型 添加激活函数&#xff08;需要增加多个隐藏层&#xff09; 模型编译 模型训练 模型预…

提升编码技能:学习如何使用 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. 创…

ubuntu查看libc版本

查看版本 查看ldd ldd --version查看libcxx strings /usr/lib/x86_64-linux-gnu/libstdc.so.6 | grep GLIBCXX查看libc getconf GNU_LIBC_VERSION # 或 strings /usr/lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC参考 glibcubuntu20.04升级GLIBC高版本方法gcc编译静态库到…

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

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

APP广告变现,开发者对接百度广告联盟,广告变现收益如何?

百度广告联盟属于广告整合平台&#xff0c;类似的还有穿山甲、优量汇、快手联盟等。 百度广告联盟注册流程&#xff1a; 创建账户&#xff1a;填写用户基本信息&#xff0c;如&#xff1a;用户名、密码、邮箱、手机号&#xff1b; 完善财务信息&#xff1a;填写银行账号、开…

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;发货量…

计算机系统概述试题

01&#xff0e;完整的计算机系统应包括()。 A.运算器、存储器、控制器 B.外部设备和主机 C.主机和应用程序 D.配套的硬件设备和软件系统 02.冯诺依曼机的基本工作方式是()。 A.控制流驱动方式 B.多指令多数据流方式 C.微程序控制方式 D.数据流驱动方式 03.下列()是冯诺依曼机…

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;其中…

leetcode03-Longest Substring Without Repeating Characters

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 分析 很直观的思路就是遍历字符串&#xff0c;如果子串中没有重复元素…