Russian Qt Forum

Qt => Работа с сетью => Тема начата: dangreen от Июнь 25, 2011, 16:52



Название: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 25, 2011, 16:52
Привет всем, искал на форуме "как качать файлы", темы то нашлись но внятного ответа нет...
И все таки: как качать файлы с http сервера средствами Qt ?

  


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 25, 2011, 17:24
попробуй это: http://www.prog.org.ru/index.php?topic=18530.msg124691#msg124691


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 25, 2011, 18:45
попробуй это: http://www.prog.org.ru/index.php?topic=18530.msg124691#msg124691
Код:
Undefined symbols for architecture x86_64:
  "QNetworkAccessManager::QNetworkAccessManager(QObject*)", referenced from:
      Downloader::Downloader(QObject*)in downloader.o
  "QNetworkRequest::QNetworkRequest(QUrl const&)", referenced from:
      Downloader::Downloader(QObject*)in downloader.o
  "QNetworkAccessManager::get(QNetworkRequest const&)", referenced from:
      Downloader::Downloader(QObject*)in downloader.o
  "QNetworkRequest::~QNetworkRequest()", referenced from:
      Downloader::Downloader(QObject*)in downloader.o


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 25, 2011, 19:26
QT += network


Название: Re: Скачивание файла с http сервера
Отправлено: BRE от Июнь 25, 2011, 19:28
В pro файле должен подключаться модуль network:
QT += network

[off]Qt-хэдеры лучше подключать без указания полного пути, тогда ты бы получил ошибку еще на стадии компиляции о том, что такие классы не доступны.[/off]

Для загрузки больших файлов все таки лучше использовать сигнал readyRead для периодического доставания данных из внутренних буферов и сохранения их на диске.


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 25, 2011, 21:37
QT += network

теперь компилируется, но как вызывать эту функцию, потомучто Downloader(this); не работает
и куда будет качаться файл


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 25, 2011, 23:22
"не работает" в смысле не качает? а ты поменял значение переменной basePath?

в моём примере скачивается в папку приложения в файл file.htm


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 26, 2011, 06:19
"не работает" в смысле не качает? а ты поменял значение переменной basePath?

в моём примере скачивается в папку приложения в файл file.htm

да поменял, и куда он качать то должен
я по системному манитору вижу что подключений приложение не делает


Название: Re: Скачивание файла с http сервера
Отправлено: merke от Июнь 26, 2011, 10:20
О ужас. Делай так PageDownloader *downloader = new PageDownloader(this);


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 26, 2011, 13:07
О ужас. Делай так PageDownloader *downloader = new PageDownloader(this);
спасибо

я уже третий раз спрашиваю: куда файл то качается?


Название: Re: Скачивание файла с http сервера
Отправлено: BRE от Июнь 26, 2011, 13:17
я уже третий раз спрашиваю: куда файл то качается?

в моём примере скачивается в папку приложения в файл file.htm
А точнее в ту папку откуда запускалось приложение.


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 26, 2011, 15:28
я уже третий раз спрашиваю: куда файл то качается?

в моём примере скачивается в папку приложения в файл file.htm
А точнее в ту папку откуда запускалось приложение.


премного благодарен


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 26, 2011, 16:21
Код:
QString basePath = "http://repo.inmac.org/";
QString named;

Downloader::Downloader(QObject *parent, QString down) : QObject(parent)
{    
        named=down;
        qnam = new QNetworkAccessManager(this);
        connect(qnam, SIGNAL(finished(QNetworkReply *)), SLOT(httpFinished(QNetworkReply *)));

        qnam->get(QNetworkRequest(QUrl(basePath+down)));
}

void Downloader::httpFinished(QNetworkReply *reply)
{
        QFile file("../Resources/"+named);
        if (file.open(QIODevice::WriteOnly))
        {
                file.write(reply->readAll());
                file.flush();
                file.close();
        }

        reply->deleteLater();
        reply = 0;
}

запускаю проект в Qt - файл качаеться
запускаю программу, ничего не качается

в чем ошибка?


Название: Re: Скачивание файла с http сервера
Отправлено: iks от Июнь 27, 2011, 22:37
Если под виндой то скорее всего не находит дрова, покиньте их в папку с бинарником (когда запускаете в Qt Creator то он дрова подкидывает, а если с бинарника то прога не находит их). На Linux в этом плане проще конечно, и так все находится


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 28, 2011, 00:19
по-моему драйвера и библиотеки - очень разные вещи :)

если б не хватало библиотеки, приложение бы матюкнулось об этом еще во время запуска и не работало бы совсем


Название: Re: Скачивание файла с http сервера
Отправлено: LisandreL от Июнь 28, 2011, 00:44
если б не хватало библиотеки, приложение бы матюкнулось об этом еще во время запуска и не работало бы совсем
Заблуждаетесь. На отсутствие dll-плагинов Qt не матюкается.

Не приложили qico4.dll? Вот вам программа без иконок.

Не приложили *sql*.dll? Вот вам программа с неработающими (просто возвращающими ошибку) запросами.


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 28, 2011, 01:12
буду знать, спасибо. но в данном случае я подразумевал более существенные библиотеки - например, файл мог бы не качаться из-за отсутствия QtNetwork4.dll, но скрин как раз показывает, что приложение бы не работало совсем


Название: Re: Скачивание файла с http сервера
Отправлено: popper от Июнь 28, 2011, 09:08
Код:
QString basePath = "http://repo.inmac.org/";
QString named;

...
void Downloader::httpFinished(QNetworkReply *reply)
{
        QFile file("../Resources/"+named);
        if (file.open(QIODevice::WriteOnly))
        {
           ....
}

запускаю проект в Qt - файл качаеться
запускаю программу, ничего не качается

в чем ошибка?

Возможно, в Creator'е приложение запускается из каталога проекта, а при запуске исполняемого файла из ../<project name>-build-desktop, поэтому относительный путь к Resources/ не совпадает, и файл на запись не открывается


Название: Re: Скачивание файла с http сервера
Отправлено: Whiplash от Июнь 28, 2011, 09:27
Проверь версию библиотеки. Может, твоя прога хватает какую-то устаревшию dll-ку где-нить в системном каталоге.


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Июнь 28, 2011, 19:23
Если под виндой то скорее всего не находит дрова, покиньте их в папку с бинарником (когда запускаете в Qt Creator то он дрова подкидывает, а если с бинарника то прога не находит их). На Linux в этом плане проще конечно, и так все находится

у меня Mac OS X


Название: Re: Скачивание файла с http сервера
Отправлено: kambala от Июнь 28, 2011, 19:57
у меня на маке тоже все работает и все загружается


Название: Re: Скачивание файла с http сервера
Отправлено: niag от Июль 11, 2011, 11:43
заметил интересную (и несколько печальную для меня) вещь. в стандартном примере http-клиента файлы формата *.gz (например вот http://www.teleguide.info/download/new3/xmltv.xml.gz) скачиваются битые (разархивировать не возможно). попросил знакомого проверить у себя - та же фигня.   есть подозрение, что в реализации http в Qt не учтен content-type для подобного вида файлов.

как вы думаете, в чем дело? а то вопрос довольно важный для меня, хотелось бы докопаться до истины


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Август 23, 2011, 13:24
попробуй это: http://www.prog.org.ru/index.php?topic=18530.msg124691#msg124691

 не могу сделать функцию в классе котораябы отслеживала скачался ли файл, подскажите как мне реализовать такое?


Название: Re: Скачивание файла с http сервера
Отправлено: Rem Norton от Сентябрь 15, 2011, 16:49
заметил интересную (и несколько печальную для меня) вещь. в стандартном примере http-клиента файлы формата *.gz (например вот http://www.teleguide.info/download/new3/xmltv.xml.gz) скачиваются битые (разархивировать не возможно). попросил знакомого проверить у себя - та же фигня.   есть подозрение, что в реализации http в Qt не учтен content-type для подобного вида файлов.

как вы думаете, в чем дело? а то вопрос довольно важный для меня, хотелось бы докопаться до истины

В приложении класс для работы с http. Правда он (класс) предназначен для использования из скрипта, но и так нормально работает. Файлы *gz, *.bz2, *.zip качает нормально. Реализация проста и понятна.


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Ноябрь 29, 2011, 18:49
а ктонить знает как сделать синхронное скачивание файла?)


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Ноябрь 30, 2011, 15:37
народ ну помогите


Название: Re: Скачивание файла с http сервера
Отправлено: thechicho от Ноябрь 30, 2011, 16:36
Код
C++ (Qt)
QNetworkAccessManager qnam;
QNetworkReply *reply = qnam.get(QNetworkRequest(QUrl("http://www.prog.org.ru")));
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
 
QString answer = reply->readAll();
//qDebug() << answer;
 
QFile file(QDir::currentPath() + "/test.html");
file.open(QIODevice::WriteOnly);
file.frite(answer.toUtf8());
file.close;


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Декабрь 01, 2011, 03:55
Код
C++ (Qt)
QNetworkAccessManager qnam;
QNetworkReply *reply = qnam.get(QNetworkRequest(QUrl("http://www.prog.org.ru")));
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
 
QString answer = reply->readAll();
//qDebug() << answer;
 
QFile file(QDir::currentPath() + "/test.html");
file.open(QIODevice::WriteOnly);
file.frite(answer.toUtf8());
file.close;

спасибо, пашет
только часть где сохраняется в файл я по своему сделал

Код
C++ (Qt)
   QNetworkAccessManager qnam;
   QNetworkReply *reply = qnam.get(QNetworkRequest(QUrl("http://download.trigen.pro/"+path+fname)));
   QEventLoop loop;
   connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
   loop.exec();
 
   QFile file("./EasyKitAssistant.app/Contents/"+fname);
   if (file.open(QIODevice::WriteOnly))
   {
           file.write(reply->readAll());
           file.flush();
           file.close();
   }


Название: Re: Скачивание файла с http сервера
Отправлено: thechicho от Декабрь 01, 2011, 10:21
// только часть где сохраняется в файл я по своему сделал
ололо, эта часть к синхронной работе отношения не имеет.
я те для наглядности ее накатал, т.к. qDebug() << answer; почему-то не всегда выводит в Qt Creator'e код страницы, видимо там лимит есть.


Название: Re: Скачивание файла с http сервера
Отправлено: thechicho от Декабрь 01, 2011, 10:25
ахаха, сам он сделал :D
у kambaly код скоммуниздил и говорит, что его ахаха :D
Код
C++ (Qt)
   if (file.open(QIODevice::WriteOnly))
   {
           file.write(reply->readAll());
           file.flush();
           file.close();
   }


Название: Re: Скачивание файла с http сервера
Отправлено: dangreen от Декабрь 01, 2011, 13:08
ахаха, сам он сделал :D
у kambaly код скоммуниздил и говорит, что его ахаха :D
Код
C++ (Qt)
   if (file.open(QIODevice::WriteOnly))
   {
           file.write(reply->readAll());
           file.flush();
           file.close();
   }

ок, сам добавил