Russian Qt Forum

Qt => Работа с сетью => Тема начата: digwnews от Июль 31, 2011, 10:49



Название: Скачивание картинок
Отправлено: digwnews от Июль 31, 2011, 10:49
Появилась проблема.
Нужно реализовать скачивание изображений из интернета и последующее сохранениев файл.
Попробовал реализовать через QNetworkaccessManager.
С помощью get метода скачиваю данные, которые лежат по пути к изображению и сохраняю в файл.
Однако сохраняется только яШяа и больше ничего в файле нет.
В чём может быть проблема? Или как вообще наладить скачивание не текстовой информации?

Спасибо.


Название: Re: Скачивание картинок
Отправлено: digwnews от Июль 31, 2011, 10:55
Или же скачивает что-то такое: GIF89aґSч
То есть не полную картинку.
Есть какие-нибудь другие средства?


Название: Re: Скачивание картинок
Отправлено: kambala от Июль 31, 2011, 11:19
у меня всё корректно скачивается через QNetworkAccessManager, тестировал на этой картинке (http://www.openbsd.org/art/puffy/ppuf1000X907.gif), использовал вот это решение: http://www.prog.org.ru/index.php?topic=18530.msg124691#msg124691 (только имя файлу лучше давать в виде QFileInfo(basePath).fileName() и можно выводить сообщение по окончании скачивания).


Название: Re: Скачивание картинок
Отправлено: digwnews от Июль 31, 2011, 12:09
Мм..
А что неверно здесь?
MainWindow.h

Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork/QNetworkReply>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
   void  saveimg(QNetworkReply*);
};

#endif // MAINWINDOW_H

main.cpp


Код:
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QFile>
#include <QByteArray>
#include <QIODevice>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QNetworkRequest req;
    QUrl url("http://www.openbsd.org/art/puffy/ppuf1000X907.gif");
    req.setUrl(url);
    QNetworkAccessManager *manager= new QNetworkAccessManager;
    manager->get(req);
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(saveimg(QNetworkReply*)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::saveimg(QNetworkReply *rep)
{
QString data = rep->readAll();

QFile file("C:\\images\\img.gif");
file.open(QIODevice::ReadWrite);
QByteArray arr("");
arr.append(data);
file.write(arr);
}

В сохраняемом файле получается такое содержимое:
GIF89aи‹ч


Название: Re: Скачивание картинок
Отправлено: kambala от Июль 31, 2011, 12:16
Код
C++ (Qt)
QString data = rep->readAll();
думаю проблема тут - readAll() всё-таки возвращает QByteArray, а не QString, а дальше ноль-символа QString не читает (а 12-й байт как раз и есть ноль-символ). лучше записывай данные в файл так:
Код
C++ (Qt)
file.write(rep->readAll());
file.flush();
и после записи не забудь удалить QNetworkReply:
Код
C++ (Qt)
rep->deleteLater();


Название: Re: Скачивание картинок
Отправлено: digwnews от Июль 31, 2011, 12:20
Да, точно!

Большое спасибо.