Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: yandzee от Сентябрь 12, 2011, 21:25



Название: Скачать много файлов QNetworkAccessManager
Отправлено: yandzee от Сентябрь 12, 2011, 21:25
Имеется такая непростая ситуация:
На хосте (http) лежат около 30 файлов (да неважно сколько). Их надо скачать QNetworkAccessManager'ом.
Не много не понятно использование QNetworkReply. Если я запущу загрузку по циклу вот так:
for(int n = 1;n<30; n++)
{
        p_folders_reply = pmanager->get(QNetworkRequest(QUrl("http://host.ru/file"+QString::number(n)+".html")));
}
То как потом все считать в файлы?


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: kambala от Сентябрь 12, 2011, 21:54
Код
C++ (Qt)
connect(pmanager, SIGNAL(finished(QNetworkReply *)), SLOT(httpFinished(QNetworkReply *)));
for(int n = 1;n<30; n++)
{
       pmanager->get(QNetworkRequest(QUrl("http://host.ru/file"+QString::number(n)+".html")));
}
 
...
 
void MyClass::httpFinished(QNetworkReply *reply)
{
QString fileName = reply->url().toString();
fileName.remove(0, fileName.lastIndexOf('/') + 1); // оставить только имя файла
 
QFile file(fileName);
if (file.open(QIODevice::WriteOnly))
{
file.write(reply->readAll());
file.flush();
file.close();
}
 
reply->deleteLater();
reply = 0;
 
qDebug("file '%s' downloaded", qPrintable(fileName));
}


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: BRE от Сентябрь 12, 2011, 22:01
Все таки лучше обрабатывать readyRead и сохранять файлы на диск приходящими кусками, а не ждать полной загрузки файлы.
Мы не знаем какого размера файлы будут передаваться (может это десятки или сотни гигабайт), а при ожидании сигнала finished данные загружаются в оперативку, которая все еще не бесконечная.



Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: yandzee от Сентябрь 12, 2011, 22:11
Спасибо!
Цитировать
Все таки лучше обрабатывать readyRead
connect(reply, SIGNAL(readyRead()), SLOT(readData()));
for(int n = 1;n<30; n++)
        {
                p_folders_reply = pmanager->get(QNetworkRequest(QUrl("http://journal.j-art.ru/p/data/nomer"+QString::number(i)+"/"+QString::number(n)+".html")));
        }
....
что-то вроде того?


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: BRE от Сентябрь 12, 2011, 22:14
Ну это скорее что то вроде этого. :)
Код
C++ (Qt)
for(int n = 1;n<30; n++)
       {
               QNetworkReply *reply = pmanager->get(QNetworkRequest(QUrl("http://journal.j-art.ru/p/data/nomer"+QString::number(i)+"/"+QString::number(n)+".html")));
               connect( reply, SIGNAL(readyRead()), SLOT(readData()) );
       }
 


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: kambala от Сентябрь 12, 2011, 22:23
Все таки лучше обрабатывать readyRead и сохранять файлы на диск приходящими кусками, а не ждать полной загрузки файлы.
согласен. то я брал код из загрузчика страничек, хотя автору он как раз и сгодится, судя по расширению скачиваемых файлов.


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: yandzee от Сентябрь 13, 2011, 14:57
Да, еще зыбыл спросить:
Например на хосте есть файлы:
1.html
2.html
3.html
5.html
6.html
for(int i=1;i<7;i++)
{
      QNetworkReply *reply = downloader->get("http://host.ru/"+QString::number(i)+".html");
      connect(reply, SIGNAL(readyRead()), SLOT(readData()));
}
Что произойдет когда обнаружится что файла 4.html нет? тупо сигнал readyRead не будет выслан?


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: kambala от Сентябрь 13, 2011, 15:46
да, будет отправлен другой сигнал - error(QNetworkReply::NetworkError code)


Название: Re: Скачать много файлов QNetworkAccessManager
Отправлено: fuCtor от Сентябрь 18, 2011, 17:30
На тему как отличить в какой файл писать:
после отправки запроса, в QNetworkReply можно в динамическое property положить нужное значение (указатель на QFile, либо имя файла), а при получении сигнала читать значение и уже писать куда надо. Получится довольно универсально.