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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: загрузить html файл по ссылке  (Прочитано 1500 раз)
sobr_vamp
Новичок

Offline Offline

Сообщений: 24


« : Июнь 17, 2011, 20:39 »

Обращаюсь к API яндекса, нахожу результаты.
Есть ссылка на страницу и сохранённая ссылка (на всякий пожарный =)

Нужен инстумент для сохранения html по ссылке на жесткий диск.
Направьте пожалуйста, куда копать и что лучше использовать.
Важен текст; картинки и остальную чепуху можно и, наверно, нужно не загружать.

Спасибо.
Записан
kambala
phpBB Житель матрицы
******
Offline Offline

Сообщений: 1247



WWW
« Ответ #1 : Июнь 17, 2011, 21:17 »

я когда-то так делал, но не знаю насколько это правильно:
Код
C++ (Qt)
#ifndef PAGEDOWNLOADER_H
#define PAGEDOWNLOADER_H
 
#include <QtCore/QObject>
 
 
class QNetworkAccessManager;
class QNetworkReply;
 
class PageDownloader : public QObject
{
   Q_OBJECT
 
public:
explicit PageDownloader(QObject *parent = 0);
 
private slots:
void httpFinished(QNetworkReply *reply);
 
private:
QNetworkAccessManager *qnam;
};
 
#endif // PAGEDOWNLOADER_H
 
Код
C++ (Qt)
#include "pagedownloader.h"
 
#include <QtCore/QFile>
 
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
 
 
static const QString basePath = "http://my.website/";
 
PageDownloader::PageDownloader(QObject *parent) : QObject(parent)
{
qnam = new QNetworkAccessManager(this);
connect(qnam, SIGNAL(finished(QNetworkReply *)), SLOT(httpFinished(QNetworkReply *)));
 
qnam->get(QNetworkRequest(QUrl(basePath)));
}
 
void PageDownloader::httpFinished(QNetworkReply *reply)
{
QFile file("file.htm");
if (file.open(QIODevice::WriteOnly))
{
file.write(reply->readAll());
file.flush();
file.close();
}
 
reply->deleteLater();
reply = 0;
}
 
Записан

K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
sobr_vamp
Новичок

Offline Offline

Сообщений: 24


« Ответ #2 : Июнь 17, 2011, 21:39 »

Спасибо
Записан
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #3 : Ноябрь 30, 2011, 16:48 »

а зачем
Код
C++ (Qt)
file.flush();

и
Код
C++ (Qt)
reply->deleteLater();
reply = 0;

у reply же предок qnam. т.е. раз qnam создается в куче, то удалять надо qnam?
или забить, удалится с выходом из приложения.
+ зачем к нулю присваивать? какая тут логика?

имхо, надо делать так:
.h
Код
C++ (Qt)
private:
QNetworkAccessManager qnam;
QNetworkReply *reply;

.cpp
Код
C++ (Qt)
PageDownloader::PageDownloader(QObject *parent) : QObject(parent)
{
reply = qnam.get(QNetworkRequst(QUrl(basePath)));
connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));
}
 
void PageDownloader::httpFinished()
{
   QFile file("file.htm");
   if (file.open(QIODevice::WriteOnly))
   {
file.write(reply->readAll());
//file.flush(); // нах?
file.close();
   }
 
   reply->deleteLater();
   //reply = 0; // тут я хз, надо или нет?
}
« Последнее редактирование: Ноябрь 30, 2011, 16:50 от thechicho » Записан
kambala
phpBB Житель матрицы
******
Offline Offline

Сообщений: 1247



WWW
« Ответ #4 : Ноябрь 30, 2011, 17:24 »

а зачем
Код
C++ (Qt)
file.flush();
так данные явно сохраняются на диск. без этого мне приходилось ждать пока консольная программа завершится, чтобы файл записался (под виндой точно).
и
Код
C++ (Qt)
reply->deleteLater();
reply = 0;

у reply же предок qnam. т.е. раз qnam создается в куче, то удалять надо qnam?
или забить, удалится с выходом из приложения.
+ зачем к нулю присваивать? какая тут логика?
Цитировать
Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.
а присваивание в 0 - на всякий случай
Записан

K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #5 : Ноябрь 30, 2011, 19:05 »

а почему file.write(reply->readAll());
сразу не записывает в файл?
write разве не синхронная функция?..

тогда, наверное, если все же использовать file.flush();
file.write(reply->readAll()); будет лишним.

QFile file("file.htm");
    if (file.open(QIODevice::WriteOnly))
    {
   file.flush();
   file.close();
    }
Записан
kambala
phpBB Житель матрицы
******
Offline Offline

Сообщений: 1247



WWW
« Ответ #6 : Ноябрь 30, 2011, 19:22 »

тогда, наверное, если все же использовать file.flush();
file.write(reply->readAll()); будет лишним.
данные из воздуха не возьмутся. flush() "Flushes any buffered data to the file".
Записан

K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #7 : Ноябрь 30, 2011, 21:26 »

а точно
Код
C++ (Qt)
   QFile file("file.htm");
   if (file.open(QIODevice::WriteOnly))
   {
       reply->readAll();
       file.flush();
       file.close();
   }
Записан
kambala
phpBB Житель матрицы
******
Offline Offline

Сообщений: 1247



WWW
« Ответ #8 : Ноябрь 30, 2011, 22:22 »

а записывать кто данные будет в файл - Пушкин?
Записан

K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
BRE
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3231



« Ответ #9 : Ноябрь 30, 2011, 22:36 »

Я не знаю, что вы обсуждаете, но закрытие файла автоматически делает flush. Улыбающийся
Кстати, при разрушении QFile файл автоматически будет закрыт (соответственно с flush).
Достаточно такого:
Код
C++ (Qt)
{
   QFile file("file.htm");
   if (file.open(QIODevice::WriteOnly))
file.write(reply->readAll());
} // Здесь будет вызван деструктор QFile, который закроет файл (close) при этом все буферы вытолкнутся на диск (flush)
 
Записан

Каждое препятствие – это возможность.
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #10 : Ноябрь 30, 2011, 23:03 »

дак,
reply->readAll(); - запишет данные в буфер.
file.flush(); - запишет из буфера в файл.
так ведь?)
BRE,
kambala сказал, что "так данные явно сохраняются на диск. без этого мне приходилось ждать пока консольная программа завершится, чтобы файл записался (под виндой точно)".
поэтому не канает, твой вариант, т.к. по словам kambala, данные запишутся только после выхода из консоли, а нам тип надо, чтобы сразу записались Улыбающийся
kambala, твой никнейм склонять можно?)
« Последнее редактирование: Ноябрь 30, 2011, 23:06 от thechicho » Записан
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #11 : Ноябрь 30, 2011, 23:06 »

Код
C++ (Qt)
   reply->readAll();
   QFile file("file.htm");
   if (file.open(QIODevice::WriteOnly))
   {        
       file.flush();
   }

ы
Записан
kambala
phpBB Житель матрицы
******
Offline Offline

Сообщений: 1247



WWW
« Ответ #12 : Ноябрь 30, 2011, 23:06 »

Я не знаю, что вы обсуждаете, но закрытие файла автоматически делает flush. Улыбающийся
ну у меня почему-то файл не записывался сразу, а только по завершении консольного приложения (в main() я просто создавал объект типа PageDownloader и вызывал app.exec()), потому я доставил flush() - хуже-то точно не будет от него Улыбающийся
дак,
reply->readAll(); - запишет данные в буфер.
file.flush(); - запишет из буфера в файл.
ну так в QFile и находится буфер, а readAll() возвращает байт-массив, который надо куда-то (в наш буфер) записать
kambala, твой никнейм склонять можно?)
можно
Записан

K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
thechicho
Крякер
****
Offline Offline

Сообщений: 379



« Ответ #13 : Ноябрь 30, 2011, 23:10 »

// ну так в QFile и находится буфер, а readAll() возвращает байт-массив, который надо куда-то (в наш буфер) записать
ааа
ну тогда, ты прав Улыбающийся
flush(); юзаем, если необходима мгновенная запись из консоли
Записан
BRE
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3231



« Ответ #14 : Ноябрь 30, 2011, 23:12 »

ну у меня почему-то файл не записывался сразу, а только по завершении консольного приложения (в main() я просто создавал объект типа PageDownloader и вызывал app.exec()), потому я доставил flush() - хуже-то точно не будет от него Улыбающийся
Возможно время жизни объекта QFile было равно жизни программы.
Сейчас же время жизни ограничивается слотом httpFinished.
А хуже конечно не будет. Улыбающийся
Записан

Каждое препятствие – это возможность.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

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