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

  • 相关阅读:
    优质Android小部件:索尼滚动相册
    Linux常用命令:文件与目录
    Android高效计算——RenderScript(二)
    Android高效计算——RenderScript(一)
    实用控件分享:自定义逼真相机光圈View
    Binder中的asInterface解析
    Android Adapter的几个方法
    Android中各种Drawable总结
    win10配置CUDA+Tensorflow2.0的一些经验
    关于Flash Helper Service的问题
  • 原文地址:https://www.cnblogs.com/findumars/p/6294232.html
Copyright © 2011-2022 走看看