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();
}
执行结果:



浙公网安备 33010602011771号