Никогда бы не подумал, что гугл по запросу "Qt FTP" меня больше запутает, чем приведет к конечной цели. Этот озорник посоветовал мне использовать QFtp, который отсутствует в Qt 5.x, по причине "глючности". А Qt 4.x его еще можно использовать немного извращенным способом. В этой статейке я постараюсь вывести читателя на освещенный и истинный путь в этом направлении.
Основное отличие отличие кода официального туториала от моего - это замена класса QFtp на QNetworkAccessManager. Чем это обусловлено я уже написал выше. На мой взгляд, человеку легче всего понять процедурное программирование, неприемлемое в Qt. Вот я и нашел в интернетах код, который просто напросто обернул в функцию. Так намного понятней понять принцип работы QNetworkAccessManager. В описании официального ftp-клиента больше воды, чем полезной информации.
Давайте попробуем просто скачать файл с сервера по ftp протоколу. Для этого благого дела понадобится объявить четыре объекта и, само собой, функцию.
В третей строке мы объявляем класс QUrl. Очень удобная вещь. На вход может принять QString, содержащий URL, и в дальнейшем отдавать все, что нужно нам. Полную информацию о классах читайте в замечательной официальной документации. В четвертой строке мы объявляем QNetworkAccessManager. Передавая ноль в конструктор, мы говорим, что предок QApplication. Четвертая строка - это сердце программы. Объект reply питает в себя всю полученную информацию по нашему запросу, которым, в свою очередь, является путь к нужному файлу(Например ftp://ftpserver.com/file.txt). QEventLoop - это своеобразный бесконечный цикл, прерываемый слотом quit(). Раз уж заговорил о слотах, давайте соединим слот finished() объекта QNetworkReply, свидетельствующий об окончании загрузки файлы.
Дальше следует исключительно работа с файлом. Данные, полученные QNetworkAccessManager и сохраненные QNetworkReply необходимо похоронить на нашем винчестере.
P.S. за подсветку синтаксиса отдельное спасибо http://highlight.hohli.com/
Основное отличие отличие кода официального туториала от моего - это замена класса QFtp на QNetworkAccessManager. Чем это обусловлено я уже написал выше. На мой взгляд, человеку легче всего понять процедурное программирование, неприемлемое в Qt. Вот я и нашел в интернетах код, который просто напросто обернул в функцию. Так намного понятней понять принцип работы QNetworkAccessManager. В описании официального ftp-клиента больше воды, чем полезной информации.
Давайте попробуем просто скачать файл с сервера по ftp протоколу. Для этого благого дела понадобится объявить четыре объекта и, само собой, функцию.
1. int getFile(char str[], char out[]) 2. { 3. QUrl url(str); 4. QNetworkAccessManager manager(0); 5. QNetworkReply * reply = manager.get(QNetworkRequest(url)); 6. QEventLoop loop;
В третей строке мы объявляем класс QUrl. Очень удобная вещь. На вход может принять QString, содержащий URL, и в дальнейшем отдавать все, что нужно нам. Полную информацию о классах читайте в замечательной официальной документации. В четвертой строке мы объявляем QNetworkAccessManager. Передавая ноль в конструктор, мы говорим, что предок QApplication. Четвертая строка - это сердце программы. Объект reply питает в себя всю полученную информацию по нашему запросу, которым, в свою очередь, является путь к нужному файлу(Например ftp://ftpserver.com/file.txt). QEventLoop - это своеобразный бесконечный цикл, прерываемый слотом quit(). Раз уж заговорил о слотах, давайте соединим слот finished() объекта QNetworkReply, свидетельствующий об окончании загрузки файлы.
В строке 2 мы запускаем цикл, ожидающий срабатывание сигнала finished() объекта QNetworkReply.1. QObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit())); 2. loop.exec();
Дальше следует исключительно работа с файлом. Данные, полученные QNetworkAccessManager и сохраненные QNetworkReply необходимо похоронить на нашем винчестере.
Теперь нам достаточно вызвать функцию GetFile(). Нужно заметить, что ее аргументами должны быть указатели на массив символов. Вот рабочий код:1. QFile file(out); 2. file.open(QIODevice::WriteOnly); 3. file.write(reply->readAll()); 4. delete reply; 5. return 0; 6. }
#include<QCoreApplication> #include<QNetworkAccessManager> #include<QNetworkReply> #include<QFile> int getFile(char str[], char out[]) { QUrl url(str); QNetworkAccessManager manager(0); QNetworkReply * reply = manager.get(QNetworkRequest(url)); QEventLoop loop; QObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit())); loop.exec(); QFile file(out); file.open(QIODevice::WriteOnly); file.write(reply->readAll()); delete reply; return 0; } int main(int argc,char * argv[]) { QCoreApplication app(argc,argv); char cPath[256]="ftp://electro:electro@ftp.ntsomz.ru/2014/March/12/1030/140312_1030_RGB.jpg"; char cOutFileName[32] = "out.jpg"; printf("Загрузка ... "); getFile(cPath,cOutFileName); printf("Готово\n"); return 0; }
P.S. за подсветку синтаксиса отдельное спасибо http://highlight.hohli.com/
QEventLoop loop;
ОтветитьУдалитьQObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit()));
loop.exec();
Эти три случайных строчки спасли мне кучу нервов и, возможно, времени. спасибо большое)
Этот комментарий был удален автором.
Удалитьdelete reply; // заменить на reply->deleteLater()
ОтветитьУдалитьVarangaOfficial - препарат варанга от грибка - исключительно достоверные, проверенные факты. Воспользовавшись нашим сайтом, вы получите возможность узнать исчерпывающую информацию касательно данного лекарственного средства. Лично увидеть данные о проведенных клинических исследований, прочесть реальные отзывы пользователей и врачей. Изучить инструкцию по использованию, прочесть об особенностях и методах работы мази, понять, как работает крем Варанга, где можно заказать оригинальный сертифицированный препарат и, как избежать покупки подделки. Мы очень тщательно проверяем публикуемые данные. Предоставляем посетителям нашего онлайн-ресурса сведения, которые берутся только из надежных источников. Если вы обнаружили у себя признаки развития грибка или же долго и безрезультатно пытаетесь излечиться от этого коварного, неприятного недуга, у нас на сайте вы найдете легкий и быстрый способ решения проблемы. Присоединяетесь и живите здоровой полноценной жизнью. Теперь все ответы можно отыскать на одном сайте.
ОтветитьУдалить