1.简介
实现FTP客户端有几种方式。
- Qt4 QFtp类
- Qt5 QNetworkAccessManager类
需要添加 Qt += network 模块。
2.用到的主要类
2.1QNetworkReply
QNetworkReply类包含使用QNetworkAccessManager发送的请求的数据和头部。与QNetworkRequest类似,它包含一个URL和标题(包括解析的和原始的形式),一些关于应答状态和应答本身内容的信息。
常用信号:
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) | 下载进度信号 |
void error(QNetworkReply::NetworkError code) | 有错误发生发出信号 |
void finished() | 结束 |
void readyRead() | 有数据来时会发出信号 |
QNetworkRequest类持有一个要用QNetworkAccessManager发送的请求,QNetworkRequest是网络访问API的一部分,是保存通过网络发送请求所需信息的类。它包含一个URL和一些可用于修改请求的辅助信息。
常用方法:
void setUrl(const QUrl &url) | 设置url |
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue) | 设置头部 |
常用方法:
QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data) | 将数据内容上载到目标请求 |
QNetworkReply *get(const QNetworkRequest &request) | 发布一个请求以获取目标请求的内容 |
3.1本地搭建一个FTP服务器。
快速搭建一个本地的FTP服务器_JXDZ的博客-CSDN博客_ftp服务器怎么搭建快速搭建一个本地的FTP服务器??如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试。第一步:配置IIS Web服务器1.1 控制面板中找到“程序”并打开1.2 程序界面找到“启用或关闭Windows功能”并打开1.3 上面两步也可以简化为一步:按【Win + R】快捷键打开运行对话框,输入“optionalfeatures”后,按回车键1.4 从“启用或关闭Windows功能”弹窗中找到Internet Information Serhttps://blog.csdn.net/dldw8816/article/details/121267419?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121267419-blog-122019088.pc_relevant_multi_platform_whitelistv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121267419-blog-122019088.pc_relevant_multi_platform_whitelistv2&utm_relevant_index=13.2示例
我按3.1中搭建好ftp服务器。
文章图片
下载代码:
首先弹出一个文件保存对话框,我在ftpserver中提前放好了一个data.txt的文件,然后设置QURL,设置用户名,密码,端口,采用get方法。有数据来后会收到readyRead信号,然后往文件中写入数据就行了。
void WFtp::on_btnDownLoad_clicked()
{
//选择一个保存路径
//设置打开路径
QString filePath = "F://";
//对话框标题
QString dlgTitle="保存文件";
//文件过滤器
QString filter="文本文件(*.txt)";
//打开对话框
QString fileName=QFileDialog::getSaveFileName(this,dlgTitle,filePath,filter);
g_file.setFileName(fileName);
g_file.open(QIODevice::WriteOnly);
QString str = ui->lineEdit->text() + "data.txt";
QUrl url(str);
url.setPort(21);
url.setUserName(ui->leUser->text());
url.setPassword(ui->lePasswd->text());
QNetworkRequest request(url);
m_reply = m_accessManager->get(request);
connect(m_accessManager, &QNetworkAccessManager::finished, this, &WFtp::slotReplyFinished);
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError)));
connect(m_reply, &QNetworkReply::downloadProgress, this, &WFtp::slotDownloadProgress);
connect(m_reply, &QNetworkReply::readyRead, this, &WFtp::slotRead);
}void WFtp::slotRead()
{
g_file.write(m_reply->readAll());
}
上传代码:
首先弹出一个文件选择对话框,选择要上传的文件,读取文件的数据到byte变量中,设置传入到ftp sever中的文件名叫upLoad.txt,最后使用put方式上传文件。
//选择一个保存路径
//设置打开路径
QString filePath = "F://";
//对话框标题
QString dlgTitle="保存文件";
//文件过滤器
QString filter="文本文件(*.txt)";
//打开对话框
QString fileName=QFileDialog::getOpenFileName(this,dlgTitle,filePath,filter);
g_file.setFileName(fileName);
g_file.open(QIODevice::ReadOnly);
QByteArray byte = g_file.readAll();
g_file.close();
QString str = ui->lineEdit->text() + "upLoad.txt";
QUrl url(str);
url.setPort(21);
url.setUserName(ui->leUser->text());
url.setPassword(ui->lePasswd->text());
QNetworkRequest request(url);
m_reply = m_accessManager->put(request,byte);
connect(m_accessManager, &QNetworkAccessManager::finished, this, &WFtp::slotReplyFinished);
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError)));
connect(m_reply, &QNetworkReply::downloadProgress, this, &WFtp::slotDownloadProgress);
上传成功
文章图片
【Qt入门|Qt QFtp客户端(上传、下载文件)】
推荐阅读
- qt|Qt_共享内存(QSharedMemory)未完成
- C++\QT|qt共享内存
- QT 组件化开发 自动生成基础组件
- C|【c ++ primer 笔记】第4章 表达式
- C|【c ++ primer 笔记】第3章 字符串、向量和数组
- 数据结构与算法(c++)|【18. 模拟栈和队列】
- C语言从0到1|【C语言】字符串函数
- cpp|cpp 模板函数,类模板(1)
- Java知识点|Java的@Aspect的@Around切不到Controller导致Controller中@Autowired的Service为空