Russian Qt Forum

Qt => Вопросы новичков => Тема начата: GamBitiK от Октябрь 09, 2014, 21:02



Название: Загрузка картинок по url
Отправлено: GamBitiK от Октябрь 09, 2014, 21:02
как можно скачать картинку и сохранить ее знаю ее url приложение консольное,т.е отображения ее не требует


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 09, 2014, 21:32
Использовать QNAM. QNetworkAccessManager, методом get запросить картинку. При получении выдрать из хедера именование картинки и сохранить на диск.


Название: Re: Загрузка картинок по url
Отправлено: GamBitiK от Октябрь 09, 2014, 23:09
Использовать QNAM. QNetworkAccessManager, методом get запросить картинку. При получении выдрать из хедера именование картинки и сохранить на диск.
С помощью qfile?? А то получить то получил ,а как сохранить на диск не доходит(((


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 10, 2014, 01:44
Если сможете разобраться - милости просим :)

Код:
QPair<QString,QByteArray> NetworkManager::getFile() 
{
errorString_.clear();
QPair<QString,QByteArray>  pair;
QUrl pageUrl_(QString("Тут мы ссылку какую нить ставим");
QEventLoop loop;
QNetworkReply * reply_ = manager_->get(QNetworkRequest(QUrl(pageUrl_)));
connect(reply_, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QString stringHeader(reply_->rawHeader(QString("Content-Disposition").toLatin1()));
stringHeader.replace("attachment; filename=","");
stringHeader = stringHeader.simplified();
stringHeader.replace(":","-");
stringHeader.replace("/","-");
stringHeader.replace("\\","-");

pair.first = stringHeader;
QByteArray tempContent = reply_->readAll();
pair.second = tempContent;

return pair;
}

PS добрый я какой то в три часа ночи после кружечки чая :D


Название: Re: Загрузка картинок по url
Отправлено: GamBitiK от Октябрь 10, 2014, 06:21
Если сможете разобраться - милости просим :)

Код:
QPair<QString,QByteArray> NetworkManager::getFile() 
{
errorString_.clear();
QPair<QString,QByteArray>  pair;
QUrl pageUrl_(QString("Тут мы ссылку какую нить ставим");
QEventLoop loop;
QNetworkReply * reply_ = manager_->get(QNetworkRequest(QUrl(pageUrl_)));
connect(reply_, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QString stringHeader(reply_->rawHeader(QString("Content-Disposition").toLatin1()));
stringHeader.replace("attachment; filename=","");
stringHeader = stringHeader.simplified();
stringHeader.replace(":","-");
stringHeader.replace("/","-");
stringHeader.replace("\\","-");

pair.first = stringHeader;
QByteArray tempContent = reply_->readAll();
pair.second = tempContent;

return pair;
}

PS добрый я какой то в три часа ночи после кружечки чая :D
Спасибо большое,но вот я так и не нашел той строчки где мы его сохраняет на диск(((


Название: Re: Загрузка картинок по url
Отправлено: Old от Октябрь 10, 2014, 06:35
С помощью qfile??
Да.


Название: Re: Загрузка картинок по url
Отправлено: GamBitiK от Октябрь 10, 2014, 07:01
А как???меня это и мучает,я не знаю как сохранить


Название: Re: Загрузка картинок по url
Отправлено: Old от Октябрь 10, 2014, 07:12
А как???меня это и мучает,я не знаю как сохранить
bool QFile::open(OpenMode mode) [virtual]
qint64 QIODevice::write(const QByteArray & byteArray)
void QIODevice::close() [virtual]


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 10, 2014, 09:33
Таки вот почему я добрый был - там же сохранения нет :D

Код:
//QPair<QString,QByteArray> inPair;
QFile file(inPair.first);
if (!file.open(QIODevice::WriteOnly))
{
    //тут жалуемся на горькую судьбу, что не дала открыть файл
    return;
}
file.write(inPair.second);
file.close();


Название: Re: Загрузка картинок по url
Отправлено: OKTA от Октябрь 10, 2014, 10:07
Забыл еще попутно предупредить о возможных подводных камнях, если использовать QEventLoop вместо человеческих сигналов  :D :P :D


Название: Re: Загрузка картинок по url
Отправлено: carrygun от Октябрь 10, 2014, 10:10
А еще ответ не удаляется.


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 10, 2014, 10:25
напомните о подводных камнях, пожалуйста.


Название: Re: Загрузка картинок по url
Отправлено: carrygun от Октябрь 10, 2014, 11:22
напомните о подводных камнях, пожалуйста.

Может оказаться так, что ответ вы будете ждать часа два (или сколько там по TCP/IP протоколу?).


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 10, 2014, 12:18
30 секунд. Как и указано в QNam'e по умолчанию. Второй раз уже сообщение пишу, первый раз написал и чуть не поседел - ток недавно проект сдавал, думал забыл об этом и там сейчас такоеееее...
Ан нет, таймаут 30 секунд, по его истечении всё равно издаётся finished, правда с ошибкой.

PS насколько помню, речь о бесконечном ожидании идёт только при некорректном отсоединении сети, когда выдёргивается кабель. Надо проверить тож, ведь обсуждалась эта тема мной ещё на Qt 4.7 .

update: и при выдёргивании нормально работает. Те же 30 секунд :)


Название: Re: Загрузка картинок по url
Отправлено: ecspertiza от Октябрь 10, 2014, 13:16
Думается имелось ввиду, не очень хорошо использовать данный способ при загрузке картинки по нажатию на кнопку например. Ибо у вас гуй повиснет, хоть и на 30 секунд, но повиснет и это есть зло :) Не даром QNAM асинхронный и лучше использовать его асинхронно.


Название: Re: Загрузка картинок по url
Отправлено: Bepec от Октябрь 10, 2014, 13:28
Не повиснет.

Это евент луп, по умолчанию все пользовательские события проходят. Так что всё нормально с гуи. Кнопки нажимаются, картинки перерисовываются. Другой вопрос что действия будут совершаться после обработки евент лупа :)

Хотя с ним довольно странная ситуация, вроде поток один, а пара-тройка евент лупов параллельно работать может :)


Название: Re: Загрузка картинок по url
Отправлено: GamBitiK от Октябрь 11, 2014, 19:15
что он вообще не работает
main.cpp
#include <QCoreApplication>
#include<picture.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
  Picture pa;
  pa.getFile();


}


picture.cpp
#include "picture.h"

Picture::Picture(QObject *parent) :
    QObject(parent)
{
}

QPair<QString,QByteArray> Picture::getFile()
{
    QNetworkAccessManager *manager_= new QNetworkAccessManager(this);
    QPair<QString,QByteArray>  pair;
        QUrl pageUrl_(QString("http://im1-tub-ru.yandex.net/i?id=d47fcb314678c246b91d961ec72fb78e-132-144&n=21"));
        QEventLoop loop;
        QNetworkReply * reply_ = manager_->get(QNetworkRequest(QUrl(pageUrl_)));
        connect(reply_, SIGNAL(finished()), &loop, SLOT(quit()));
        loop.exec();
        QString stringHeader(reply_->rawHeader(QString("Content-Disposition").toLatin1()));
            stringHeader.replace("attachment; filename=","");
            stringHeader = stringHeader.simplified();
            stringHeader.replace(":","-");
            stringHeader.replace("/","-");
            stringHeader.replace("\\","-");

            pair.first = stringHeader;
            QByteArray tempContent = reply_->readAll();
            pair.second = tempContent;

            QFile file(pair.first);
            if (!file.open(QIODevice::WriteOnly))
            {
             
                qDebug()<<"bad";
            }
            file.write(pair.second);
            file.close();



           return pair;
}