从网站下载文件

Posted

技术标签:

【中文标题】从网站下载文件【英文标题】:Download file from a website 【发布时间】:2015-01-17 17:42:27 【问题描述】:

我正在寻求有关我的小程序的帮助。我想使用 QNetwork 类从网站下载安装程序 (.exe)。我已经搜索并阅读了很多关于它的帖子,但它不起作用。

下载.cpp:

Download::Download(QObject *parent) :
QObject(parent)



void Download::initialiseDownload()

    QNetworkAccessManager manager;
    QNetworkRequest request;

    request.setUrl(QUrl("http://www.mylink.com/setup.exe"));
    reply = manager.get(request);

    QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
    QObject::connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgress(qint64, qint64)));
    QObject::connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));


void Download::downloadError(QNetworkReply::NetworkError err)

    qDebug() << reply->errorString();
    reply->deleteLater();


void Download::updateProgress(qint64 read, qint64 total)

    qDebug() << "Progress...";
    qint64 percent = (read / total) * 100;
    qDebug() << percent;


void Download::downloadFinished()

    qDebug() << "Finished !";
    QByteArray b = reply->readAll();
    QFile file("./sdk/setup.exe");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << b;
    reply->deleteLater();

下载.h:

#include "launcher.h"
#include <QObject>
#include <QtNetwork>

class Download : public QObject, public Launcher

    Q_OBJECT
public:
    explicit Download(QObject *parent = 0);
    void Download::initialiseDownload();

private slots:
    void downloadError(QNetworkReply::NetworkError err);
    void updateProgress(qint64 read, qint64 total);
    void downloadFinished();

private:
    QNetworkReply *reply;
;

我已经为 OpenSSL 添加了 dll 并且它可以工作。我还在“.pro”文件中添加了“网络”。但是,当我运行我的程序并单击另一个类的按钮时,initialiseDownload() 正在工作,但信号似乎处于非活动状态。

提前致谢!

【问题讨论】:

【参考方案1】:

在您的 Download::initialiseDownload() 函数中,您创建一个在函数末尾超出范围的 QNetworkAccessManager

将您的 QNetworkAccessManager 作为成员变量或至少在下载期间它所在的位置。

考虑到您将您的类称为“下载”,最合乎逻辑的是 QNetworkAccessManager 位于(或是)您的 Download 实例的父级中,因为您(可以)同时启动多个下载QNetworkAccessManager.

【讨论】:

以上是关于从网站下载文件的主要内容,如果未能解决你的问题,请参考以下文章

浏览器文件只能从http网站下载

使用 js 从网站下载或仅保存图像文件

Java 从网站下载文件

如何将文件从网站下载到用户的 iCloud

一个 PHP 脚本让用户从我的网站下载文件而不显示我网站中的实际文件链接?

如何从 C# 中的网站下载文件 [关闭]