Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
5 / 5 / 6
Регистрация: 24.01.2016
Сообщений: 67
1

Загрузка файлов с QNetworkAccessManager на Android 6.0

21.12.2016, 14:22. Показов 826. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
filedownloader.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef FILEDOWNLOADER_H
#define FILEDOWNLOADER_H
 
#include <QObject>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QFile>
#include <QTemporaryFile>
 
class FileDownloader : public QObject
{
    Q_OBJECT
    QNetworkAccessManager m_WebCtrl;
    QString Type;
    QString m_data;
    QFile *pFile;
    QString Destination;
 
public:
    explicit FileDownloader(QString type, QUrl Url, QString Destination = "", QObject *parent = 0);
    virtual ~FileDownloader();
    QString downloadedData() const;
    QString getDestination() const;
 
signals:
    void downloaded(bool result);
 
private slots:
    void fileDownloaded(QNetworkReply* pReply);
 
};
 
#endif // FILEDOWNLOADER_H
filedownloader.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "filedownloader.h"
 
FileDownloader::FileDownloader(QString Type_, QUrl Url, QString Destination_, QObject *parent) :
    QObject(parent)
{   
    qDebug() << "FileDownloader constructor";
    Type = Type_;
    Destination = Destination_;
    if (Type == "toFile")
    {
        qDebug() << "FileDownloader constructor - 1";
        pFile = new QFile;
        pFile->setFileName(Destination);
        pFile->open(QIODevice::WriteOnly);
    }
    qDebug() << "FileDownloader constructor - 2";
    connect(&m_WebCtrl, SIGNAL (finished(QNetworkReply*)), this, SLOT (fileDownloaded(QNetworkReply*)));
    QNetworkRequest request(Url);
    qDebug() << "FileDownloader constructor - 3";
    if (QSslSocket::supportsSsl())
        request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
    else
        qDebug() << "Error! Ssl unsupposed!";
    qDebug() << "FileDownloader constructor - 4";
    m_WebCtrl.get(request);
    qDebug() << "FileDownloader constructor - 5";
}
 
FileDownloader::~FileDownloader()
{
    qDebug() << "FileDownloader destructor";
}
 
void FileDownloader::fileDownloaded(QNetworkReply* pReply)
{
    qDebug() << "fileDownloaded";
    bool result;
    if (pReply->error() == QNetworkReply::NoError)
    {
        result = true;
        if (Type == "toFile")
        {
            pFile->write(pReply->readAll());
        }
        else
        {
            m_data = pReply->readAll();
        }
    }
    else
    {
        qDebug() << "fileDownloaded - error";
        result = false;
        m_data = pReply->errorString();
    }
    if (Type == "toFile" && pFile->isOpen())
    {
        pFile->close();
        pFile->deleteLater();
    }
    //pReply->deleteLater();
    emit downloaded(result);
}
 
QString FileDownloader::downloadedData() const
{
    return m_data;
}
 
QString FileDownloader::getDestination() const
{
    return Destination;
}
Используется этот класс в нескольких местах, проблемы возникают тут:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void App::saveFileUrl(QString target)
{
    ...
    m_pFileDownloader = new FileDownloader("toFile", target, destination);
    connect(m_pFileDownloader, SIGNAL (downloaded(bool)), this, SLOT (SaveFileUrlDone(bool)));
}
 
void App::SaveFileUrlDone(bool result)
{
    qDebug() << "load icon finish";
    if (result)
    {
        Settings.setSetting("toolbarItemIconPath", "file://" + m_pFileDownloader->getDestination());
        emit signalQml("loadIconDone", "true");
    }
    else
    {
        qDebug() << m_pFileDownloader->downloadedData();
        emit signalQml("loadIconDone", "false");
    }
    delete m_pFileDownloader;
}
Проблема в следующем: при первом вызове файл скачивается и сохраняется, после я его использую - проблем нет. Но при втором обращении к функции saveFileUrl приложение крашится, лог такой:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FileDownloader constructor
FileDownloader constructor - 1
FileDownloader constructor - 2
FileDownloader constructor - 3
FileDownloader constructor - 4
W google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
W google-breakpad: Chrome build fingerprint:
W google-breakpad: 1.0
W google-breakpad: 1
W google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12654 (QtThread)
I [MALI][Gralloc]: [+]r_hnd(0xd7b5e1e0), client(36), share_fd(35)
D GraphicBuffer: register, handle(0xd7b5e1e0) (w:1080 h:1920 s:1088 f:0x1 u:0x000b00)
D OpenGLRenderer: ProgramCache save to disk, size = 2
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2016, 14:22
Ответы с готовыми решениями:

Поиск и загрузка файлов с Windows на Android
Друзья, не посоветуете ли, как решить такую задачу. На компе с Виндовс есть в нескольких папках (с...

Закачать разом несколько файлов через QNetworkAccessManager
Через QNetworkAccessManager::post() можно отправлять на HTTP-сервер файлы по одному. А можно ли...

Как загружать несколько файлов сразу через QNetworkReply и QNetworkAccessManager
Доброго времени суток. задача такая, нужно мне скачать сразу несколько файлов как я это делаю: ...

Загрузка файлов RTF файлов в БД и отображение их в RichTextBox
при отображении файла из БД при помощи компонента отображается такое вот ...

2
86 / 45 / 11
Регистрация: 20.12.2010
Сообщений: 216
Записей в блоге: 1
22.12.2016, 10:05 2
Цитата Сообщение от LetoLetoD Посмотреть сообщение
pFile = new QFile;
Файл можно и в стэке создать, без выделения памяти, но конструкция с выделением в конструкторе, и освобождением в как-то мне не нравится. Если класс FileDownloader в стэке, или Вы его создаёте, как-то освобождение в деструкторе логичнее.
Ну или перед
C++ (Qt)
1
if (Type == "toFile")
сделайте
C++ (Qt)
1
pFile = Q_NULLPTR;
, а в деструкторе:
C++ (Qt)
1
2
3
4
5
if (pFile!=Q_NULLPTR){
    if (pFile->isOpened)
       pFile->close();
    delete pFile;
}


Кстати, раз вам нравится выводить отладочный вывод, то могу посоветовать добавить к выводу __FUNCTION__ и __LINE__.
Попробуйте, gcc давно эти директивы поддерживает.
1
5 / 5 / 6
Регистрация: 24.01.2016
Сообщений: 67
23.12.2016, 11:44  [ТС] 3
Skjame, спасибо за замечания, все это тоже поправлю и буду использовать.

А моя основная проблема решилась, после того, как я перестроил FileDownloader и перестал его для каждой закачки создавать/удалять, теперь он живет все отведенное приложению время.
0
23.12.2016, 11:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2016, 11:44
Помогаю со студенческими работами здесь

Загрузка android проекта на GitHub
Ребят кто знает как загрузить android проект на GitHub?

Загрузка ОЗУ на 100% на Android
Здравствуйте. В последнее время озу смартфона (explay a400) стала загружаться на 100%. Раньше такой...

Android Загрузка изображения на стену vkontakte
Здравствуйте всем, возникла необходимость загрузить фотографию на стену вконтакте. На сайте...

Загрузка картинки из ресурсов в Bitmap. Android 4.1.1
Добрый вечер. Дело заключается в следующем: я загружаю картинку из ресурсов (png) в Bitmap таким...

Android: Сохранение и загрузка изображения в/из SQLite
Доброго времени суток. Необходимо записать в базу только что нарисованное изображение на canvas. В...

Android Studio 32 bit - загрузка SDK
Уже всякие форумы обшарил, не могу понять, как исправить это. Скачал архив программы с сайта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru