本篇内容主要实现向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;