基于QNetworkAccessManager实现向FTP服务器上传和下载文件

本篇内容主要实现向FTP服务器上传本地文件列表和从FTP服务器下载指定文件,关于如何使用QNetworkAccessManager从FTP服务器下载文件列表,本人尚未找到方法,网络上有人说没法实现,后面用QFTP再实现吧。

界面如下

在这里插入图片描述

代码部分

全局变量定义如下:

QUrl url;
QNetworkAccessManager *accessManager; //初始化为nullptr
QNetworkReply *reply;                 //初始化为nullptr
QFile *file;                          //初始化为nullptr
QStringList fileList;  
int fileNum;                          //初始化为0
bool download;                        //初始化为false
bool upload;                          //初始化为false
QList<QFileInfo> localFilePathList;

相关函数声明

QStringList getFileNames(QString path);  //获取本地目录下的全部文件

槽函数声明

void on_uploadButton_clicked();   
void on_downloadButton_clicked();
void readContent();
void replyFinished(QNetworkReply*);	
void error(QNetworkReply::NetworkError error);

各槽函数内容如下

void on_uploadButton_clicked()
{
	upload = true;  //上传文件标识
	QString dirPath = QApplication::applicationDirPath() + "/../Resource/";  
	fileList = getFileNames(dirPath);  //获取指定目录下的指定类型的所有文件
	ui.textEdit->append("Upload file list:");  //显示界面提示内容

	//循环上传文件
	foreach(QFileInfo info, localFilePathList)
	{
		QString fileNamePath = info.absoluteFilePath();  //获取待上传文件的绝对路径
		ui.textEdit->append(fileNamePath);   //显示到界面编辑框中

		file = new QFile(fileNamePath);
		file->open(QIODevice::ReadOnly);
		QByteArray byte_file = file->readAll(); 

		//配置url
		QString uploadUrl = "ftp://127.0.0.1/" + info.fileName();
		QUrl url(uploadUrl);
		url.setPort(21);
		url.setUserName("cheng");
		url.setPassword("12345678");

		accessManager = new QNetworkAccessManager(this);
		accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);
		QNetworkRequest request(url);
		reply = accessManager->put(request, byte_file);  //发送上传请求

		connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
		connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(loadError(QNetworkReply::NetworkError)));
	}
}

//获取要上传的文件目录
QStringList getFileNames(QString path)
{
	QDir dir(path);
	QStringList nameFilters;
	nameFilters << "*.dat" << "*.txt";
	localFilePathList = QList<QFileInfo>(dir.entryInfoList(nameFilters));
	QStringList files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
	return files;
}


void on_downloadButton_clicked()
{
	download = true;  //下载文件标识
	QString str = QApplication::applicationDirPath();
	file = new QFile(str + "/download.dat");           //指定文件下载到的本地路径
	bool openFlag=file->open(QIODevice::WriteOnly);

	//配置url
	QUrl url("ftp://127.0.0.1/test.dat");  //ftp服务器下的文件
	url.setPort(21);
	url.setUserName("cheng");
	url.setPassword("12345678");

	accessManager = new QNetworkAccessManager(this);
	accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

	QNetworkRequest request(url);
	reply = accessManager->get(request);  //发送下载请求

	connect((QObject *)reply, SIGNAL(readyRead()), this, SLOT(readContent()));
	connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
	connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(loadError(QNetworkReply::NetworkError)));
}

//下载时将FTP服务器上文件内容写入本地文件
void readContent()
{
	QByteArray readData = reply->readAll();
	file->write(readData);
}

void replyFinished(QNetworkReply*)
{
	if ((download==true) && (reply->error() == QNetworkReply::NoError))  //下载完成
	{
		download = false;
		file->flush();
		file->close();
		ui.textEdit->append(tr("Finished download!"));
	}
	else if ((upload == true) && (reply->error() == QNetworkReply::NoError))  //每个文件上传完成都执行
	{
		file->close();
		fileNum++;

		if (fileNum == fileList.size())  //全部上传完毕
		{
			fileNum = 0;
			upload = false;
			ui.textEdit->append(tr("Finished upload!"));
		}
	}
	else
	{
		QMessageBox::critical(NULL, "Error", "Failed!!!");
	}
}
void error(QNetworkReply::NetworkError error)
{
	ui.textEdit->append("Transmitted error!!!");
}

释放资源

在析构函数中释放资源
if (reply!=nullptr)
	reply->deleteLater();
if (accessManager!=nullptr)
	delete accessManager;
if (file != nullptr)
	delete file;
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值