Qt - https请求下载视频文件

方法一

以下是一个使用Qt进行HTTP请求下载MP4文件的简单示例:

#include <QApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建网络访问管理器
    QNetworkAccessManager manager;

    // 发送GET请求,获取MP4文件
    QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://vjs.zencdn.net/v/oceans.mp4")));

    // 接收响应完成时触发finished信号
    QObject::connect(reply, &QNetworkReply::finished, [&]()
    {
        // 检查是否有错误
        if (reply->error() != QNetworkReply::NoError)
        {
            qDebug() << "下载出错:" << reply->errorString();
            reply->deleteLater();
            return;
        }
        // 创建本地文件,用于保存下载的MP4文件
        QFile file("downloaded.mp4");
        if (!file.open(QIODevice::WriteOnly))
        {
            qDebug() << "无法打开文件";
            reply->deleteLater();
            return;
        }
        // 将响应数据写入本地文件
        file.write(reply->readAll());
        file.close();
        qDebug() << "下载完成";
        reply->deleteLater();
    });

    return a.exec();
}

执行结果:

这个示例中,我们创建了一个QNetworkAccessManager对象来处理网络请求。然后使用get()函数发送GET请求,并指定要下载的MP4文件的URL。在接收到响应后,我们检查是否有错误,并将响应数据写入本地文件。

请注意替换示例中的URL和本地文件名为实际的URL和文件名。另外,这只是一个简单的示例,并没有处理网络请求超时、进度等其他方面的功能。在实际应用中,可能需要进行更多的错误处理和边界情况的检查。

 

 

方法二

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUrl>

class QFile;
class QNetworkReply;
class QNetworkAccessManager;


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void startRequst(QUrl url);


private slots:
    void httpFinished(); //文件接收完成
    void httpReadyRead();//接收数据中
    void updateDataReadProgress(qint64,qint64);//进度条更新
    void on_pushButton_clicked();   //发送请求

private:
    QNetworkAccessManager *manager;// 创建网络访问管理器
    QNetworkReply *reply;
    QFile* file;
    QUrl url;


private:
    Ui::Widget *ui;


};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QSslSocket>
#include <QFile>
#include <QFileInfo>
#include <QDebug>


Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);



    //构建一个QNetworkAccessManager对象,通过这个对象实现各种请求
    manager = new QNetworkAccessManager(this);

    //未下载时先隐藏进度条
    ui->progressBar->hide();

    ui->lineEdit->setText("http://vjs.zencdn.net/v/oceans.mp4");
}

Widget::~Widget()
{
    delete ui;

}

void Widget::startRequst(QUrl url)
{

    //get请求,返回QNetworkReply类型,当有新数据到达时会触发readyRead信号
    reply = manager->get(QNetworkRequest(url));

    //触发readyRead信号时,处理新到的数据
    connect(reply,&QNetworkReply::readyRead,this,&Widget::httpReadyRead);

    //触发finished信号时,表示文件接收完成
    connect(reply,&QNetworkReply::finished,this,&Widget::httpFinished);
    //信号原型QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

    //bytesReceived表示发送的字节数,bytesTotal表示总字节数。
    connect(reply,&QNetworkReply::downloadProgress,this,&Widget::updateDataReadProgress);
}

//接收响应数据
void Widget::httpReadyRead()
{
    //将接收的数据写入文件
    if(file)
    {
        file->write(reply->readAll());
    }
}

void Widget::httpFinished()
{
    //文件接收完成清理资源

    if(file)
    {
        file->close();
        delete file;
        file  = 0;
    }
    //销毁QNetworkReply对象
    reply->deleteLater();
    reply= 0;

}

//更新进度条
void Widget::updateDataReadProgress(qint64 byteRead,qint64 totalBytes)
{
    //设置接收文件总字节为进度条最大值
    ui->progressBar->setMaximum(totalBytes);
    //设置当前进度的值为接收到的数据
    ui->progressBar->setValue(byteRead);
}

//下载按钮
void Widget::on_pushButton_clicked()
{
    //获取URL
    url = ui->lineEdit->text();
    QFileInfo info(url.path());
    //解析URL文件名,以改文件名作为接收文件名
    QString filename(info.fileName());
    if(filename.isEmpty()) {
        //为空创建空文件
         filename = "index.html";
    }
    //创建QFile对象
    file = new QFile(filename);
    if(!file->open(QIODevice::WriteOnly))
    {
        delete  file;
        file = 0;
        return;
    }
    //发送请求
    startRequst(url);
    //进度条清0
    ui->progressBar->setValue(0);
    ui->progressBar->show();
}

执行结果:

 

posted @ 2024-10-08 11:07  [BORUTO]  阅读(520)  评论(0)    收藏  举报