我编写了一个测试类,用于了解有关QNetworkAccessManager
及其与FTP上传相关的功能的更多信息。我试图通过FTP将我的Raspberry Pi中的文件上传到我的Windows PC,这在我只想上传单个文件时效果很好。但是,我想一次传输多个文件;在客户端和主机之间拖动文件夹时,FileZilla执行此操作的方式相同;它开始多个上传/下载而不是一个接一个地顺序。以下是我的ftp_test.h
和ftp_test.cpp
个文件。如果我向upload()
提供文件名列表,则对于此列表中的每个名称,都会在服务器上执行put请求。但是,只有第一个文件上传,第二个,第三个,第四个。等等。
class ftp_test: public QObject
{
Q_OBJECT
public:
ftp_test (QObject *p = 0): QObject(p) { }
void upload(QString video_directory, std::vector<QString> filename);
public slots:
void uploadProgress(qint64 bytesSent, qint64 bytesTotal);
void uploadDone();
private:
QNetworkAccessManager nam;
QFile *data;
QNetworkReply *reply;
QEventLoop loop;
};
我的ftp_test.cpp
void ftp_test::upload(QString video_directory, std::vector<QString> filename)
{
for(int i = 0; i < filename.size(); i++)
{
QUrl url("ftp://xx.xx.xx.xxx:xxxxx/" + filename[i]);
url.setUserName("pi");
if(QFile::exists(video_directory + filename[i]))
{
data = new QFile(video_directory + filename[i], this);
if (data->open(QIODevice::ReadOnly))
{
reply = nam.put(QNetworkRequest(url), data);
connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(uploadProgress(qint64, qint64)));
connect(reply, SIGNAL(finished()), SLOT(uploadDone()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(someError(QNetworkReply::NetworkError)));
}
else
{
return;
}
}
else
{
qDebug() << "Oops";
return;
}
}
loop.exec();
}
void ftp_test::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
qDebug() << "Uploaded" << bytesSent << "of" << bytesTotal;
}
void ftp_test::uploadDone()
{
qDebug() << "Finished" << reply->error();
data->deleteLater();
reply->deleteLater();
reply = 0;
loop.quit();
}
我考虑过为这个工作制作多个线程,但在我深入研究之前,可能会有一些我不知道的事情。
我知道它会在第一次上传成功后停止上传,但这并不重要,因为我还没有看到并行上传。
这是它的工作方式吗?如何实现文件的并发传输而不是顺序传输?