Russian Qt Forum
Апреля 28, 2025, 22:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: загрузить html файл по ссылке  (Прочитано 13638 раз)
sobr_vamp
Гость
« : Июня 17, 2011, 20:39 »

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

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

Спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля 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;
}
 
Записан

Изучением 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
sobr_vamp
Гость
« Ответ #2 : Июня 17, 2011, 21:39 »

Спасибо
Записан
thechicho
Гость
« Ответ #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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля 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 - на всякий случай
Записан

Изучением 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
thechicho
Гость
« Ответ #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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Ноября 30, 2011, 19:22 »

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

Изучением 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
thechicho
Гость
« Ответ #7 : Ноября 30, 2011, 21:26 »

а точно
Код
C++ (Qt)
   QFile file("file.htm");
   if (file.open(QIODevice::WriteOnly))
   {
       reply->readAll();
       file.flush();
       file.close();
   }
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Ноября 30, 2011, 22:22 »

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

Изучением 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
Гость
« Ответ #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
Гость
« Ответ #10 : Ноября 30, 2011, 23:03 »

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

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

ы
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Ноября 30, 2011, 23:06 »

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

Изучением 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
thechicho
Гость
« Ответ #13 : Ноября 30, 2011, 23:10 »

// ну так в QFile и находится буфер, а readAll() возвращает байт-массив, который надо куда-то (в наш буфер) записать
ааа
ну тогда, ты прав Улыбающийся
flush(); юзаем, если необходима мгновенная запись из консоли
Записан
BRE
Гость
« Ответ #14 : Ноября 30, 2011, 23:12 »

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


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