How can i get ftp files show on my list widget using QNetworkAccessManager Qt 5.8?



  • Dear Freinds,

    Im writing a small ftp program that can connect to ftp.trolltech.com and list all files on a list widgets and download it. i can connect to ftp.trolltech.com but i don't know how to list them . Please help me im new in Qt programming.

    Thank you for your support.



  • FtpDialog.h

    #ifndef FTPDIALOG_H
    #define FTPDIALOG_H

    #include <QDialog>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <QUrl>
    #include <QDebug>

    namespace Ui {
    class FtpDialog;
    }

    class FtpDialog : public QDialog
    {
    Q_OBJECT

    public:
    explicit FtpDialog(QWidget *parent = 0);
    ~FtpDialog();

    public slots:
    void connectClicked();
    void readRead(QNetworkReply *reply);
    void getFiles(QNetworkReply *reply);
    signals:
    void dataReadyRead(QByteArray);

    private:
    Ui::FtpDialog *ui;
    QNetworkAccessManager *ftp = new QNetworkAccessManager(this);
    };

    #endif // FTPDIALOG_H



  • FtpDialog.cpp

    #include "ftpdialog.h"
    #include "ui_ftpdialog.h"

    FtpDialog::FtpDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::FtpDialog)
    {
    ui->setupUi(this);
    connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(connectClicked()));
    connect(ftp, SIGNAL(finished(QNetworkReply )), this, SLOT(readRead(QNetworkReply )));
    connect(ftp, SIGNAL(finished(QNetworkReply
    )), this, SLOT(getFiles(QNetworkReply
    )));

    ui->disconnectButton->setEnabled(false);
    ui->cdButton->setEnabled(false);
    ui->upButton->setEnabled(false);
    ui->getButton->setEnabled(false);
    

    }

    FtpDialog::~FtpDialog()
    {
    delete ui;
    }

    void FtpDialog::connectClicked()
    {
    ui->connectButton->setEnabled(false);

     ftp->get(QNetworkRequest(QUrl("ftp.trolltech.com")));
     ui->statusLabel->setText(tr("Connecting to host..."));
    

    }

    void FtpDialog::readRead(QNetworkReply *reply)
    {
    ui->statusLabel->setText(tr("Ready."));

    ui->disconnectButton->setEnabled(true);
    ui->cdButton->setEnabled(true);
    ui->upButton->setEnabled(true);
    ui->getButton->setEnabled(true);
    

    }

    void FtpDialog::getFiles(QNetworkReply *reply)
    {

    QByteArray data = reply->readAll();
    qDebug()<< data;
    

    }


  • Lifetime Qt Champion

    Hi,

    The old QFtp module might make your life easier.



  • But Qt Creator does not recognize it. what can i do please?


  • Lifetime Qt Champion

    Clone it and build it.



  • those links gave me a 404 error. sorry


  • Lifetime Qt Champion

    What links ?




  • Lifetime Qt Champion

    Those are links to use with the git clone command.



  • please be patient with me im new in Qt. i have typed git clone git://code.qt.io/qt/qtftp.git. i have this message checking connectivity....done. what can i do else?


  • Lifetime Qt Champion

    This has nothing to do with Qt.

    Didn't you get a new folder named qtftp ?



  • yes . will i build it in Qt?


  • Lifetime Qt Champion

    Open the project .pro file with Qt Creator and build it.

    By the way, what OS are you on ?



  • linux mint 18 sarah



  • i got this message : cannot create a directory / mkspecs/modules-inst when im building it


  • Lifetime Qt Champion

    Which version of Qt are you using to build that module ?



  • Qt 5.7.1 . now i can build . what can i do else?



  • my programm does not recognize QFtp but i have already built it


  • Lifetime Qt Champion

    Did you install the module ?



  • yes i have installed the module


  • Lifetime Qt Champion

    Did you add QT += ftp to your .pro file and re-run qmake after that ?



  • yes.

    But commandFinshed signal does not work. here is my code:

    FtpDialog.h

    #ifndef FTPDIALOG_H
    #define FTPDIALOG_H

    #include <QDialog>
    #include <QFtp>
    #include <QMessageBox>
    #include <QDebug>

    namespace Ui {
    class FtpDialog;
    }

    class FtpDialog : public QDialog
    {
    Q_OBJECT

    public:
    explicit FtpDialog(QWidget *parent = 0);
    ~FtpDialog();

    public slots:
    void connectClicked();
    void ftpFinished(int, bool);
    void getFileList();
    signals:

    private:
    Ui::FtpDialog *ui;
    QFtp ftp;
    };

    #endif // FTPDIALOG_H



  • FtpDialog.cpp

    #include "ftpdialog.h"
    #include "ui_ftpdialog.h"

    FtpDialog::FtpDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::FtpDialog)
    {
    ui->setupUi(this);
    connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(connectClicked()));
    connect(&ftp,SIGNAL(commandFinished(int,bool)), this, SLOT(ftpFinished(int,bool)));

    ui->disconnectButton->setEnabled(false);
    ui->cdButton->setEnabled(false);
    ui->upButton->setEnabled(false);
    ui->getButton->setEnabled(false);
    

    }

    FtpDialog::~FtpDialog()
    {
    delete ui;
    }

    void FtpDialog::connectClicked()
    {
    ui->connectButton->setEnabled(false);

     ftp.connectToHost("ftp.trolltech.com");
     ui->statusLabel->setText(tr("Connecting to host..."));
    

    }

    void FtpDialog::ftpFinished(int request, bool error)
    {
    // Handle errors depending on the command caussing it
    qDebug()<<ftp.currentCommand();
    if(error)
    {
    switch(ftp.currentCommand())
    {
    case QFtp::ConnectToHost:
    QMessageBox::warning(this, tr("Error"), tr("Failed to connect to host."));
    ui->connectButton->setEnabled(true);

            break;
        case QFtp::Login:
            QMessageBox::warning(this, tr("Error"), tr("Failed to login."));
            ui->connectButton->setEnabled(true);
    
            break;
    
        case QFtp::List:
            QMessageBox::warning(this, tr("Error"),
                                 tr("Failed to get file list.\nClosing connection"));
            ftp.close();
    
            break;
    
        }
    
        ui->statusLabel->setText(tr("Ready."));
    

    }
    // React to the current command and issue
    // more commands or update the user interface
    else
    {
    switch(ftp.currentCommand())
    {
    case QFtp::ConnectToHost:
    ftp.login();

            break;
        case QFtp::Login:
            getFileList();
    
            break;
    
        case QFtp::Close:
            ui->connectButton->setEnabled(true);
           // getFileList();
    
            break;
        case QFtp::List:
            ui->disconnectButton->setEnabled(true);
            ui->upButton->setEnabled(true);
            ui->statusLabel->setText(tr("Ready."));
    
            break;
    
        }
    }
    

    }

    void FtpDialog::getFileList()
    {

    }


  • Moderators

    @walter-j You should connect a slot to http://doc.qt.io/qt-4.8/qftp.html#stateChanged and see what happens



  • But in the book they used commandFinished(int, bool) signal.



  • @walter-j

    keep in mind that QFftp has not been updated for a very long time and therefore may not automatically support your target FTp-Servers protocolls.

    I run into this, when one of my old projects worked fine with the old FTP-Server but failed completely with the new one.


  • Moderators

    @walter-j I did not say you should not use commandFinished, just add another slot to see whether you get any state changes.



  • You need an external library and I don't feel to recommend QFtp as it's not maintained anymore. libCURL is probably the standard library in the C/C++ world (and probably beyond). You can use a cpp wrapper like curlpp if you don't like the aftertaste C leaves in your mouth.

    This example (source) will download the list of files from ftp://ftp.funet.fi/ and save it in a file called ftp-list

    #include <stdio.h>
     
    #include <curl/curl.h>
     
    static size_t
    write_response(void *ptr, size_t size, size_t nmemb, void *data)
    {
      FILE *writehere = (FILE *)data;
      return fwrite(ptr, size, nmemb, writehere);
    }
     
    #define FTPBODY "ftp-list"
    #define FTPHEADERS "ftp-responses"
     
    int main(void)
    {
      CURL *curl;
      CURLcode res;
      FILE *ftpfile;
      FILE *respfile;
     
      /* local file name to store the file as */ 
      ftpfile = fopen(FTPBODY, "wb"); /* b is binary, needed on win32 */ 
     
      /* local file name to store the FTP server's response lines in */ 
      respfile = fopen(FTPHEADERS, "wb"); /* b is binary, needed on win32 */ 
     
      curl = curl_easy_init();
      if(curl) {
        /* Get a file listing from sunet */ 
        curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.funet.fi/");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
        /* If you intend to use this on windows with a libcurl DLL, you must use
           CURLOPT_WRITEFUNCTION as well */ 
        curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response);
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, respfile);
        res = curl_easy_perform(curl);
        /* Check for errors */ 
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
     
        /* always cleanup */ 
        curl_easy_cleanup(curl);
      }
     
      fclose(ftpfile); /* close the local file */ 
      fclose(respfile); /* close the response file */ 
     
      return 0;
    }
    


  • stateChanged solved the problem.

    Thank you guys

    JK


  • Lifetime Qt Champion

    You're welcome !

    Since you have it working now, please mark the thread as solved using the "Topic Tools" button so that other forum users may know a solution has been found :)



  • i have searched for it . i didn't find


  • Lifetime Qt Champion

    Do you mean the "Topic Tools" button ?

    There's one just under your original post or at the bottom of the page under the last post.



  • how can i clone QHttp? can i have the link for the repository?



  • when compiling QHttp i got this error : /home/walter-j/Documents/5.8/gcc_64/mkspecs/features/qt_module_headers.prf:153: error: Cannot write file /include/QtHttp/QtHttpDepends: Cannot create parent directory

    can someone help me?


  • Lifetime Qt Champion

    Where did you download it from ?





  • can someone help me to download the right package of QHttp?

    Thank your for your support

    JK



  • The correct repository for Qt Http is http://code.qt.io/cgit/qt/qthttp.git/
    Again, this is unmaintained code that has been abandoned, my advise is to use an external library that can do the same things (and more) see links above



  • @SGaist
    Sorry i don't know how to install the module after i compiled the qtftp


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.