Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved]QNetworkAccessManager sometimes does not download file
Forum Updated to NodeBB v4.3 + New Features

[Solved]QNetworkAccessManager sometimes does not download file

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 3 Posters 1.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    alamahant
    wrote on last edited by alamahant
    #1

    Hi Guys,
    Noob here.
    I just wrote a simple downlod file app.
    Everything is working fine progressBar and all.
    However although some files even big isos download just fine some other files simply wont start downloading at all.
    Either Qt or the remote server closes the connection.
    Here is an excerpt from my code:
    [code]
    void MainWindow::on_downloadButton_clicked()
    {

    url = QUrl(ui->lineEdit->text());
    request.setUrl(url);
    reply = manager->get(request);
    //reply->ignoreSslErrors();
    connect(reply,&QIODevice::readyRead,this,&MainWindow::downloadBegin);
    connect(reply, &QNetworkReply::finished, this, &MainWindow::downloadEnd);
    connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::setProgress);
    //connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &MainWindow::displayNetworkError);
    

    }
    [/code]

    [code]
    void MainWindow::downloadBegin()
    {

    mDataBuffer->append(reply->readAll());
    qDebug() << "Incoming Data....";
    

    }

    [/code]

    [code]
    void MainWindow::downloadEnd()
    {
    if(reply->NoError) {
    qDebug() << "Error :" + reply->errorString();
    }else {
    QString filename = MainWindow::savaAs();
    QFile file(filename);

        if (file.open(QIODevice::WriteOnly)) {
            qDebug() << "file opened";
            file.write(*mDataBuffer);
            file.close();
            qDebug() << "file closed";
        }else {
            qDebug() << "Download Error!!";
        }
    }
    

    }
    [/code]

    What might the problem be?
    Is it an SSL error?
    How to deal with it?
    For example I can download fine a Void iso but NOT a Debian iso.
    I am so confused...
    Any help would be god sent.
    Thanks for the care and consideration...
    :)

    JonBJ 1 Reply Last reply
    0
    • A alamahant

      Hi Guys,
      Noob here.
      I just wrote a simple downlod file app.
      Everything is working fine progressBar and all.
      However although some files even big isos download just fine some other files simply wont start downloading at all.
      Either Qt or the remote server closes the connection.
      Here is an excerpt from my code:
      [code]
      void MainWindow::on_downloadButton_clicked()
      {

      url = QUrl(ui->lineEdit->text());
      request.setUrl(url);
      reply = manager->get(request);
      //reply->ignoreSslErrors();
      connect(reply,&QIODevice::readyRead,this,&MainWindow::downloadBegin);
      connect(reply, &QNetworkReply::finished, this, &MainWindow::downloadEnd);
      connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::setProgress);
      //connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &MainWindow::displayNetworkError);
      

      }
      [/code]

      [code]
      void MainWindow::downloadBegin()
      {

      mDataBuffer->append(reply->readAll());
      qDebug() << "Incoming Data....";
      

      }

      [/code]

      [code]
      void MainWindow::downloadEnd()
      {
      if(reply->NoError) {
      qDebug() << "Error :" + reply->errorString();
      }else {
      QString filename = MainWindow::savaAs();
      QFile file(filename);

          if (file.open(QIODevice::WriteOnly)) {
              qDebug() << "file opened";
              file.write(*mDataBuffer);
              file.close();
              qDebug() << "file closed";
          }else {
              qDebug() << "Download Error!!";
          }
      }
      

      }
      [/code]

      What might the problem be?
      Is it an SSL error?
      How to deal with it?
      For example I can download fine a Void iso but NOT a Debian iso.
      I am so confused...
      Any help would be god sent.
      Thanks for the care and consideration...
      :)

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by
      #2

      @alamahant
      I don't know the answer, but why do you comment out:

      connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &MainWindow::displayNetworkError);

      Is it not possible that some useful error message is being ignored?

      One other thing: how long does your reply variable stay in scope? Is it a MainWindow member variable or a local variable? I haven't used this QNAM stuff, but I assume it must stay till at least QNetworkReply::finished, does it do so for you?

      1 Reply Last reply
      0
      • A Offline
        A Offline
        alamahant
        wrote on last edited by alamahant
        #3

        @JonB ,
        Thanks a lot for the reply.
        :)

        The manager, reply and data buffer are declared in header file as pointers and initialized in the constructor like this:

        manager = new QNetworkAccessManager(this);
        reply = nullptr;
        mDataBuffer = new QByteArray();

        Even if if i uncomment the connect error statement I get no output from qQebug().
        This is my displayError method:

        void MainWindow::displayNetworkError()
        {
        qDebug() << reply->errorString();
        }

        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          I would not download large files this way. I would connect to QNetworkReply::readyRead() to read all currently available data and write it out to the file. Otherwise you may need e.g. 4GB of continuous memory when downloading a 4GB iso which might not work (or only sometimes)

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          1
          • A Offline
            A Offline
            alamahant
            wrote on last edited by alamahant
            #5

            @Christian-Ehrlicher
            I AM connecting to QNetworkReply::readyRead()
            Please see my initial post.
            :)

            Christian EhrlicherC 1 Reply Last reply
            0
            • A alamahant

              @Christian-Ehrlicher
              I AM connecting to QNetworkReply::readyRead()
              Please see my initial post.
              :)

              Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @alamahant But then you save the stuff in memory instead directly writing to file so the problem stays the same.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              1 Reply Last reply
              1
              • A Offline
                A Offline
                alamahant
                wrote on last edited by
                #7

                @Christian-Ehrlicher
                Thanks for the clarity.
                How do I do what you are proposing.
                In qDebug I see thousands of "incoming data" while the file is being downloaded.
                Therefore it seems it is reading and writing in batches....
                Please forgive my ignorance but i am not clear what you are proposing that i do......
                :)

                JonBJ 1 Reply Last reply
                0
                • Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @alamahant said in QNetworkAccessManager sometimes does not download file:

                  How do I do what you are proposing.

                  Don't understand - instead writing to a buffer in readyRead() write to you output file.

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  2
                  • A alamahant

                    @Christian-Ehrlicher
                    Thanks for the clarity.
                    How do I do what you are proposing.
                    In qDebug I see thousands of "incoming data" while the file is being downloaded.
                    Therefore it seems it is reading and writing in batches....
                    Please forgive my ignorance but i am not clear what you are proposing that i do......
                    :)

                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by
                    #9

                    @alamahant
                    During your downloadBegin() (btw, bad name, this is attached to readyRead() so is called over & over) you are presently pushing all the bytes received into *mDataBuffer, and only writing the complete buffer to file at end in downloadEnd(). @Christian-Ehrlicher is pointing out that if the file is, say, 4GB long that will use up 4GB of memory --- bad idea. He wants you to open the output file at the start, and write the bytes received as they arrive in readyRead() to file at that point, so as not to use up memory.

                    1 Reply Last reply
                    2
                    • A Offline
                      A Offline
                      alamahant
                      wrote on last edited by alamahant
                      #10

                      @all
                      Yes I tried the proposed solution but I still cant get certain files to download, while others -- equally large download just fine.
                      I think its a client/server negotiation issue but i am clueless how to debug it.
                      Should I maybe set download speed limit or something of the sort?
                      Or is it an SSL thing.
                      Does Qt use certificates and where are they located?
                      Or best how to force it to not close any connection on ssl errors if --indeed the closing happens by Qt.
                      I dont get any info also from my connect error statement and the pethod associated with it.
                      Please see above...
                      Sory for tiring you
                      Thanks a lot

                      JonBJ 1 Reply Last reply
                      0
                      • A alamahant

                        @all
                        Yes I tried the proposed solution but I still cant get certain files to download, while others -- equally large download just fine.
                        I think its a client/server negotiation issue but i am clueless how to debug it.
                        Should I maybe set download speed limit or something of the sort?
                        Or is it an SSL thing.
                        Does Qt use certificates and where are they located?
                        Or best how to force it to not close any connection on ssl errors if --indeed the closing happens by Qt.
                        I dont get any info also from my connect error statement and the pethod associated with it.
                        Please see above...
                        Sory for tiring you
                        Thanks a lot

                        JonBJ Online
                        JonBJ Online
                        JonB
                        wrote on last edited by JonB
                        #11

                        @alamahant
                        I don't know, other than I would have expected some sort of error.

                        The most obvious question is what are these URLs? If you have one file that downloads and another that does not, are they at the same site/in the same directory, or in different sites, or what? Are these across https? Are you able to visit these URLs in a browser, outside of Qt application?

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          alamahant
                          wrote on last edited by
                          #12

                          For example This downloads fine
                          https://alpha.de.repo.voidlinux.org/live/20170220/void-live-x86_64-20170220-xfce.iso

                          BUT this closes the connection

                          https://cdimage.debian.org/cdimage/bullseye_di_alpha2/amd64/iso-cd/debian-bullseye-DI-alpha2-amd64-netinst.iso

                          It seems this is nOT a size amatter as the second is much smaller than the first.
                          Nor an http/https issue as both are https.
                          So the logical conclusion is some kind of negotiation tls handshake error.
                          Both download fine with wget.
                          BUT I just noticed something in the wget output.

                          The first one(the one that downloads fine gives this output

                          wget https://alpha.de.repo.voidlinux.org/live/20170220/void-live-x86_64-20170220-xfce.iso
                          --2020-09-30 19:19:58-- https://alpha.de.repo.voidlinux.org/live/20170220/void-live-x86_64-20170220-xfce.iso
                          Resolving alpha.de.repo.voidlinux.org... 95.216.76.97
                          Connecting to alpha.de.repo.voidlinux.org|95.216.76.97|:443... connected.
                          HTTP request sent, awaiting response... 200 OK
                          Length: 558891008 (533M) [application/octet-stream]
                          Saving to: ‘void-live-x86_64-20170220-xfce.iso’

                          void-live-x86_64-20170220-xfc 0%[ ] 2.60M 1.45MB/s

                          WHEREAS the secon -- the one fails to download gives this:

                          wget https://cdimage.debian.org/cdimage/bullseye_di_alpha2/amd64/iso-cd/debian-bullseye-DI-alpha2-amd64-netinst.iso
                          --2020-09-30 19:20:20-- https://cdimage.debian.org/cdimage/bullseye_di_alpha2/amd64/iso-cd/debian-bullseye-DI-alpha2-amd64-netinst.iso
                          Resolving cdimage.debian.org... 194.71.11.165, 194.71.11.173, 2001:6b0:19::165, ...
                          Connecting to cdimage.debian.org|194.71.11.165|:443... connected.
                          HTTP request sent, awaiting response... 302 Found
                          Location: https://saimei.ftp.acc.umu.se/cdimage/bullseye_di_alpha2/amd64/iso-cd/debian-bullseye-DI-alpha2-amd64-netinst.iso [following]
                          --2020-09-30 19:20:22-- https://saimei.ftp.acc.umu.se/cdimage/bullseye_di_alpha2/amd64/iso-cd/debian-bullseye-DI-alpha2-amd64-netinst.iso
                          Resolving saimei.ftp.acc.umu.se... 194.71.11.138, 2001:6b0:19::138
                          Connecting to saimei.ftp.acc.umu.se|194.71.11.138|:443... connected.
                          HTTP request sent, awaiting response... 200 OK
                          Length: 360710144 (344M) [application/x-iso9660-image]
                          Saving to: ‘debian-bullseye-DI-alpha2-amd64-netinst.iso’

                                debian-bullseye-DI-   0%[                                                ] 792.00K   732KB/s               ^C
                          

                          IS THERE a redirect of some sort involved in the second?
                          And if yes how to adjustt my Qt code to cover for this?

                          Thankssssssss
                          :)

                          1 Reply Last reply
                          0
                          • A Offline
                            A Offline
                            alamahant
                            wrote on last edited by alamahant
                            #13

                            Here is another one that does NOT work

                            wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20200923T214503Z/stage3-amd64-20200923T214503Z.tar.xz
                            --2020-09-30 19:29:39-- https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20200923T214503Z/stage3-amd64-20200923T214503Z.tar.xz
                            Resolving bouncer.gentoo.org... 140.211.166.178, 2001:470:ea4a:1:225:90ff:fe02:1957
                            Connecting to bouncer.gentoo.org|140.211.166.178|:443... connected.
                            HTTP request sent, awaiting response... 302 Found
                            Location: https://mirror.isoc.org.il/pub/gentoo//releases/amd64/autobuilds/20200923T214503Z/stage3-amd64-20200923T214503Z.tar.xz [following]
                            --2020-09-30 19:29:41-- https://mirror.isoc.org.il/pub/gentoo//releases/amd64/autobuilds/20200923T214503Z/stage3-amd64-20200923T214503Z.tar.xz
                            Resolving mirror.isoc.org.il... 192.115.211.70, 2a01:4280:2:211a::70
                            Connecting to mirror.isoc.org.il|192.115.211.70|:443... connected.
                            HTTP request sent, awaiting response... 200 OK
                            Length: 219663964 (209M) [application/octet-stream]
                            Saving to: ‘stage3-amd64-20200923T214503Z.tar.xz’

                                     stage3-amd64-202   0%[                                                ]  39.40K  17.8KB/s               ^C
                            

                            What all the failed ones have in common is that there is some short of redirect involved....
                            Or is it Apache vs Nginx?
                            Where should I look to solve this?
                            Thanks Guys
                            :)

                            1 Reply Last reply
                            0
                            • Christian EhrlicherC Offline
                              Christian EhrlicherC Offline
                              Christian Ehrlicher
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @alamahant said in QNetworkAccessManager sometimes does not download file:

                              short of redirect involved....

                              correct, see https://doc.qt.io/qt-5/qnetworkrequest.html#Attribute-enum / QNetworkRequest::RedirectionTargetAttribute

                              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                              Visit the Qt Academy at https://academy.qt.io/catalog

                              1 Reply Last reply
                              3
                              • A Offline
                                A Offline
                                alamahant
                                wrote on last edited by
                                #15

                                @Christian-Ehrlicher
                                Yessssssssssssssss.
                                You are a life saver.
                                After setting
                                request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, 21);

                                It WORKS!!!!!
                                Thanks a lot....
                                :)

                                Christian EhrlicherC 1 Reply Last reply
                                0
                                • A alamahant

                                  @Christian-Ehrlicher
                                  Yessssssssssssssss.
                                  You are a life saver.
                                  After setting
                                  request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, 21);

                                  It WORKS!!!!!
                                  Thanks a lot....
                                  :)

                                  Christian EhrlicherC Offline
                                  Christian EhrlicherC Offline
                                  Christian Ehrlicher
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  @alamahant Nice, hope you leave the direct write to a file in your code since it saves a lot of memory :)

                                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                  Visit the Qt Academy at https://academy.qt.io/catalog

                                  1 Reply Last reply
                                  0

                                  • Login

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • Users
                                  • Groups
                                  • Search
                                  • Get Qt Extensions
                                  • Unsolved