zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    浙江大华2012笔试题+答案解析
    腾讯2011年10月15日校招笔试+答案解析
    百度2011招聘笔试题+答案解析
    阿里巴巴2011笔试题+答案解析
    微软2012实习生笔试题+答案解析
    腾讯2012实习生笔试题+答案解析
    迅雷2012春招+答案解析
    华为2012春上机笔试题+参考程序
    中兴2011笔试题+答案解析
    mysql修改数据库名
  • 原文地址:https://www.cnblogs.com/findumars/p/6294232.html
Copyright © 2011-2022 走看看