如何使用QNetworkAccessManager通过FTP并行上传多个文件?

时间:2017-06-20 11:49:06

标签: c++ qt ftp

我编写了一个测试类,用于了解有关QNetworkAccessManager及其与FTP上传相关的功能的更多信息。我试图通过FTP将我的Raspberry Pi中的文件上传到我的Windows PC,这在我只想上传单个文件时效果很好。但是,我想一次传输多个文件;在客户端和主机之间拖动文件夹时,FileZilla执行此操作的方式相同;它开始多个上传/下载而不是一个接一个地顺序。以下是我的ftp_test.hftp_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();
}

我考虑过为这个工作制作多个线程,但在我深入研究之前,可能会有一些我不知道的事情。

我知道它会在第一次上传成功后停止上传,但这并不重要,因为我还没有看到并行上传。

这是它的工作方式吗?如何实现文件的并发传输而不是顺序传输?

0 个答案:

没有答案