IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau Discussion :

QNetworkAccessManager : télécharger plusieurs fichiers


Sujet :

Réseau

  1. #1
    Membre habitué
    Femme Profil pro
    architecte
    Inscrit en
    Mars 2024
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : architecte
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2024
    Messages : 11
    Par défaut QNetworkAccessManager : télécharger plusieurs fichiers
    bonjour tout le monde

    je continue doucement mon apprentissage de Qt et j'essaye de faire une petite application pour télécharger des notices de montage Lego
    mais j'ai un problème seul le dernier élément de ma liste d'adresse est prise en compte et je ne comprends pas pourquoi

    voici mon code
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mainwindow.h"
     
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include "filedownloader.h"
     
    QT_BEGIN_NAMESPACE
    namespace Ui {
    class MainWindow;
    }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        QString File;
     
    private slots:
        void on_pushButton_download_clicked();
        void download();
     
    private:
        Ui::MainWindow *ui;
        FileDownloader *m_pPdfCtrl;
    };
    #endif // MAINWINDOW_H
    mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include "mainwindow.h"
    #include "./ui_mainwindow.h"
    #include <QUrl>
    #include "filedownloader.h"
    #include <QFile>
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::on_pushButton_download_clicked()
    {
        QList<QString> references = {"6145884","6145887","4656079"};
        QString baseUrlStr = "https://www.lego.com/cdn/product-assets/product.bi.core.pdf/";
        for (int i=0; i<references.size(); i++)
        {
            QUrl pdfurl = baseUrlStr + references[i]+".pdf";
            File = "C:\\notice_lego\\" + references[i] + ".pdf";
            qDebug() << pdfurl;
            m_pPdfCtrl = new FileDownloader(pdfurl, this);
            connect(m_pPdfCtrl, SIGNAL (downloaded()), this, SLOT (download()));
     
        }
    }
     
    void MainWindow::download()
    {
        QByteArray pdf = m_pPdfCtrl->downloadedData();
        qDebug() << File;
        QFile file (File);
        if (!file.open(QFile::WriteOnly))
        {
            qDebug()<< "impossible d'ouvrir le fichier demandé";
        }
     
        else
        {
            file.write(pdf);
            file.close();
        }
     
     
    }
    filedownloader.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     #ifndef FILEDOWNLOADER_H
    #define FILEDOWNLOADER_H
     
    #include <QObject>
    #include <QByteArray>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
     
    class FileDownloader : public QObject
    {
        Q_OBJECT
    public:
        explicit FileDownloader(QUrl pdfUrl, QObject *parent = 0);
        virtual ~FileDownloader();
        QByteArray downloadedData() const;
     
    signals:
        void downloaded();
     
    private slots:
        void fileDownloaded(QNetworkReply* pReply);
    private:
        QNetworkAccessManager m_WebCtrl;
        QByteArray m_DownloadedData;
    };
     
    #endif // FILEDOWNLOADER_H
    filedownloder.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     #ifndef FILEDOWNLOADER_H
    #define FILEDOWNLOADER_H
     
    #include <QObject>
    #include <QByteArray>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
     
    class FileDownloader : public QObject
    {
        Q_OBJECT
    public:
        explicit FileDownloader(QUrl pdfUrl, QObject *parent = 0);
        virtual ~FileDownloader();
        QByteArray downloadedData() const;
     
    signals:
        void downloaded();
     
    private slots:
        void fileDownloaded(QNetworkReply* pReply);
    private:
        QNetworkAccessManager m_WebCtrl;
        QByteArray m_DownloadedData;
    };
     
    #endif // FILEDOWNLOADER_H
    filedownload.h et filedownload.cpp proviennent d'ici https://wiki.qt.io/Download_Data_from_URL
    Si vous avez des info a me donner j'en serai ravie .

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur Système
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Système

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Par défaut
    Bonjour,

    Quand tu écris ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        for (int i=0; i<references.size(); i++)
        {
            QUrl pdfurl = baseUrlStr + references[i]+".pdf";
            File = "C:\\notice_lego\\" + references[i] + ".pdf";
            qDebug() << pdfurl;
            m_pPdfCtrl = new FileDownloader(pdfurl, this);
            connect(m_pPdfCtrl, SIGNAL (downloaded()), this, SLOT (download()));
     
        }
    A chaque itération, tu vas écraser m_pPdfCtrl et donc il ne restera que la dernière.
    Soit tu veux faire ça séquenciellement et tu dois gérer ton incrément après la fin de chaque téléchargement et sauvegarde de fichier, soit tu veux faire ça en parallèle et dans ce cas, il faut te pencher du côté des QThread. Et là vu ton code, tu tomberas sur d'autres écueils car ton enregistrement de fichier se fait en dehors.

  3. #3
    Membre habitué
    Femme Profil pro
    architecte
    Inscrit en
    Mars 2024
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : architecte
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2024
    Messages : 11
    Par défaut
    J'ai repris mon code qui semble maintenant fonctionner, les 3 pdf sont lus l'un après l'autre, je n'utilise plus filedownloader,
    mais maintenant je ne sais pas comment enregistrer le fichier à l'adresse File

    mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include "mainwindow.h"
    #include "./ui_mainwindow.h"
    #include <QUrl>
    #include <QFile>
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::on_pushButton_download_clicked()
    {
     
        QList<QString> references = {"6145884","6145887","4656079"};
        QString baseUrlStr = "https://www.lego.com/cdn/product-assets/product.bi.core.pdf/";
        for (int i=0; i<references.size(); i++)
        {
            File = "C:\\notice_lego\\" + references[i] + ".pdf";
            QUrl pdfurl = baseUrlStr + references[i]+".pdf";
            getPdf(pdfurl);
            qDebug() << baseUrlStr + references[i]+".pdf";
        }
    }
     
    void MainWindow::getPdf(QUrl url)
    {
        qDebug() << File;
        QNetworkAccessManager* man = new QNetworkAccessManager( this );
        connect(man, SIGNAL(finished(QNetworkReply*)), this, SLOT(reply(QNetworkReply*)));
        man->get(QNetworkRequest(url));
    }
     
    void MainWindow::reply(QNetworkReply* reply)
    {
        QByteArray pdf;
        pdf = reply->readAll();
        qDebug() << pdf.size();
        QFile file (File);
        if (!file.open(QFile::WriteOnly))
        {
            qDebug()<< "impossible d'ouvrir le fichier demandé";
        }
        else
        {
            file.write(pdf);
            file.close();
        }
    }

Discussions similaires

  1. [linux][gcc] Comment travaille t-on avec plusieurs fichiers?
    Par kaygee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/04/2004, 17h48
  2. [struts] utilisation de plusieurs fichiers de config
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 25/03/2004, 10h04
  3. Tester la presence de plusieurs fichiers
    Par Little_Goldo dans le forum Linux
    Réponses: 4
    Dernier message: 17/03/2004, 11h34
  4. [struts] utiliser plusieurs fichiers properties
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 7
    Dernier message: 03/10/2003, 17h02
  5. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo