QT网络编程之HTTP协议

1 实现高层网络操作的类

QT网络模块提供一些类实现OSI 7层网络模型中高层的网络协议,如HTTP、FTP、SNMP等。
QNetworkRequest类通过一个URL地址发起网络协议请求,也保存网络请求的信息,目前支持HTTP、FTP、URLs的下载或上传。
QNetworkAccessManager类用于协调网络操作,QNetworkRequest发起一个请求后,QNetworkAccessManager用于发送网络请求,创建网络响应。
QNetworkReply类表示网络请求的响应,是QIODevice的子类,支持流读写功能,也支持异步或同步工作模式。提供信号finished()、readyRead()、downloadProgress()可用于监测网络响应的执行情况,执行相应的操作。

2 基于HTTP的网络文件下载

网络文件URL地址可以用来获取文件。

#include <QMessageBox>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QDesktopServices>
QFile* downloadedFile;
void MainWindow::on_btnDownload_clicked()
{//开始下载 按钮
    QString urlSpec = ui->editURL->text().trimmed();//删去开头和结尾的空字符
    if (urlSpec.isEmpty())
    {
        QMessageBox::information(this, "错误","请指定需要下载的URL");
        return;
    }

    QUrl newUrl = QUrl::fromUserInput(urlSpec);//根据用户输入的字符串转换成合法的URL地址
    if (!newUrl.isValid())
    {
        QMessageBox::information(this, "错误", QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));
        return;
    }

    QString tempDir = ui->editPath->text().trimmed();//获取指定的临时目录
    if (tempDir.isEmpty())
    {
        QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");
        return;
    }

    QString fullFileName = tempDir + newUrl.fileName(); //临时文件名
    if (QFile::exists(fullFileName))
        QFile::remove(fullFileName);
    downloadedFile =new QFile(fullFileName);//创建临时文件
    if (!downloadedFile->open(QIODevice::WriteOnly))
    {
        QMessageBox::information(this, tr("错误"),"临时文件打开错误");
        return;
    }
    
	QNetworkAccessManager networkManager;//网络管理
    QNetworkReply* reply = networkManager.get(QNetworkRequest(newUrl));//发布网络请求,请求下载URL地址表示的文件,并创建网络响应
    connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));//响应结束后发射
    connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));//缓冲区有新下载的数据等待读取时发射
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(on_downloadProgress(qint64,qint64)));//表示网络操作进度的信号,表示已读取字节数和总字节数
}

void MainWindow::on_readyRead()
{//读取下载的数据
    downloadedFile->write(reply->readAll());
}

void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进程
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}

void MainWindow::on_finished()
{//网络响应结束,下载完毕
    QFileInfo fileInfo;
    fileInfo.setFile(downloadedFile->fileName());
    downloadedFile->close();
    delete downloadedFile;
    downloadedFile = Q_NULLPTR;

    reply->deleteLater(); //
    reply = Q_NULLPTR;

    if (ui->checkOpen->isChecked())//打开下载的文件
        QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));

    ui->btnDownload->setEnabled(true);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值