Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)

  从Qt的版本进化中可以知道,在Qt4中的QFtp类到了Qt5中已经没有了,虽然可以通过在Qt5中自己编译出QFtp,但是Qt5中提供的QNetworkAccessManager在发送和请求网络方面有更好的兼容性和扩展性,包括ftp请求和http请求。

  这里提供一个Qt4中QFtp的源码获取方式:

git clone git://code.qt.io/qt/qtftp.git
git clone http://code.qt.io/qt/qtftp.git
git clone https://code.qt.io/qt/qtftp.git

  下面的ftp上传功实现了在有密码和无密码的情况下上传:

#include <QtCore>
#include <QtNetwork>
#include <QDebug>

class Uploader: public QObject
{
    Q_OBJECT
public:
    Uploader(QObject *p = 0): QObject(p){  }

    void start(const QString &file){
        // no passwd
        // QUrl url("ftp://172.20.5.167/ftp.txt");
        QUrl url;
        url.setScheme("ftp");
        url.setHost("172.20.5.167");
        // 这里是设置远端主机上传时的文件名,不设置则名称为本地端上传名称
        url.setPath("/ftp.txt");
        url.setUserName("root");
        url.setPort(21);

        // need passwd
        /*
        QUrl url("ftp://172.20.5.167/ftp.txt");
        url.setScheme("ftp");
        url.setUserName("root");
        url.setPort(21);
        */

        data = new QFile(file, 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()));
        }
        else
            qDebug() << "Oops";
    }

public slots:
    void uploadProgress(qint64 bytesSent, qint64 bytesTotal)    {
        qDebug() << "Uploaded" << bytesSent << "of" << bytesTotal;
    }

    void uploadDone()     {
        qDebug() << "Finished" << reply->error();
        data->deleteLater();
        reply->deleteLater();
    }

private:
    QNetworkAccessManager nam;
    QFile *data;
    QNetworkReply *reply;
};

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);                          
    // 去除ftp上传时network.ssl警告
    QLoggingCategory::setFilterRules("qt.network.ssl.warning=false");
    Uploader u;
    u.start(QString("C:/Users/yicm/Qt/test.txt"));
    return app.exec();
}
// 编译时不要漏掉下面这句
#include "main.moc"

  上面程序主要注意的地方是本地端上传文件和主机端文件,理解QUrl(无密码为ftp://root@172.20.5.167.com:21):

qurl

保证ftp地址的每一个部分都设置到位。

 

http://blog.csdn.net/freeape/article/details/52802163

posted @ 2017-01-17 19:07  findumars  Views(3218)  Comments(0Edit  收藏  举报