Russian Qt Forum
Апрель 25, 2024, 06:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFtp: success story  (Прочитано 5153 раз)
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
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Ноябрь 22, 2008, 00:02 »

Вы забыли написать как этим пользоваться.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Godfather
Гость
« Ответ #2 : Ноябрь 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&)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 22.