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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скачать много файлов QNetworkAccessManager  (Прочитано 8073 раз)
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")));
}
То как потом все считать в файлы?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Сентябрь 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));
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
BRE
Гость
« Ответ #2 : Сентябрь 12, 2011, 22:01 »

Все таки лучше обрабатывать readyRead и сохранять файлы на диск приходящими кусками, а не ждать полной загрузки файлы.
Мы не знаем какого размера файлы будут передаваться (может это десятки или сотни гигабайт), а при ожидании сигнала finished данные загружаются в оперативку, которая все еще не бесконечная.

Записан
yandzee
Гость
« Ответ #3 : Сентябрь 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")));
        }
....
что-то вроде того?
Записан
BRE
Гость
« Ответ #4 : Сентябрь 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()) );
       }
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Сентябрь 12, 2011, 22:23 »

Все таки лучше обрабатывать readyRead и сохранять файлы на диск приходящими кусками, а не ждать полной загрузки файлы.
согласен. то я брал код из загрузчика страничек, хотя автору он как раз и сгодится, судя по расширению скачиваемых файлов.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
yandzee
Гость
« Ответ #6 : Сентябрь 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 не будет выслан?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Сентябрь 13, 2011, 15:46 »

да, будет отправлен другой сигнал - error(QNetworkReply::NetworkError code)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
fuCtor
Гость
« Ответ #8 : Сентябрь 18, 2011, 17:30 »

На тему как отличить в какой файл писать:
после отправки запроса, в QNetworkReply можно в динамическое property положить нужное значение (указатель на QFile, либо имя файла), а при получении сигнала читать значение и уже писать куда надо. Получится довольно универсально.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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