Russian Qt Forum

Qt => Работа с сетью => Тема начата: Godfather от Ноябрь 21, 2008, 18:23



Название: QFtp: success story
Отправлено: Godfather от Ноябрь 21, 2008, 18:23
Всем привет!
У меня долго не получалось заставить QFtp соединяться с сервером и загрузить файлы.
И я решил поделиться рецептом, тем более не все топики, которые я здесь видел, заканчивались успешно..

Код:
void Foo::Upload()
{
   this->ftpConnection = new QFtp(this);
   connect(ftpConnection, SIGNAL(stateChanged(int)), this, SLOT(ftpStateChanged()));
   connect(ftpConnection, SIGNAL(done(bool)), this, SLOT(ftpConnected(bool)));
   ftpConnection->connectToHost("host", 21);
   ftpConnection->login("user", "pass");
}

void Foo::ftpConnected(bool hasError)
{
   if(hasError)
   {
      QString error;
      switch(ftpConnection->error())
      {
         case QFtp::HostNotFound:
         {
            error = "не удалось обнаружить адрес";
            break;
         }
         default:
         {
            error = ftpConnection->errorString().replace("\n", " "); // errorString() часто содержит \n
            break;
         }
      }
      this->logger->addRecord("Ошибка соединения с FTP-сервером: ") + error; // мой логгер
}

void Foo::ftpStateChanged()
{
   if(ftpConnection->state() == QFtp::LoggedIn)
   {
      ftpConnection->cd("dir1/dir2");
      if(ftpConnection->error() != QFtp::NoError)
      {
         logger->addRecord("Ошибка соединения с FTP-сервером: ") + ftpConnection->errorString());
         return;
      }
      else
      {
         QDir dir("c:/uploads");
         if(!dir.exists())
         {
            logger->addRecord("Указанная папка не существует");
            return;
         }
         QStringList fileList = dir.entryList(QDir::Files);
         for(QStringList::const_iterator it = fileList.begin(); it != fileList.end(); it++)
         {
            QFile file("c:/uploads/" + *it);
            if(file.open(QIODevice::ReadOnly))
            {
               ftpConnection->put(file.readAll(), *it);
               if(ftpConnection->error() == QFtp::NoError)
               {
                  logger->addRecord("Файл успешно выгружен: " + *it);
                  file.remove();
               }
               else
               {
                  logger->addRecord("Не удалось выгрузить файл: " + *it);
               }
            }
         }
         ftpConnection->close();
      }
   }
}

Qt 4.3.5


Название: Re: QFtp: success story
Отправлено: xintrea от Ноябрь 22, 2008, 00:02
Вы забыли написать как этим пользоваться.


Название: Re: QFtp: success story
Отправлено: Godfather от Ноябрь 22, 2008, 04:03
эм..

QFtp* ftpConnection - локальная переменная класса

void ftpStateChanged(), void ftpConnected(bool) - методы объявленные как public slots

что делает? соединяется с ftp-сервером по адресу 'host' (префикс ftp:// можно не указывать) порт 21, по логину 'user' / паролю 'pass' и загружает в удаленную папку dir1/di2 все файлы, содержащиеся в локальной c:\uploads, после чего удаляет их
всё происходящее журналируется через некий класс logger::addRecord(const QString&)