您的位置:首页 > 编程语言 > Qt开发

Qt通过QNetworkAccessManager实现Http get方法文件下载

2014-08-07 22:29 776 查看
前面已经实现了Qt的网络通信,这里在网络通信的基础上加上文件下载功能。相比与之前的例子添加了QFile与QProgressBar这两个类

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>
#include <QNetworkAccessManager>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QPushButton>
#include <QVBoxLayout>
#include <QIODevice>
#include <QFileInfo>
#include <QProgressBar>

/********************HTTP上传数据******************************/
/*************************************************************/
/*************************************************************/
/*************************************************************/
class Dialog : public QDialog
{
Q_OBJECT

public:
Dialog(QWidget *parent = 0);
~Dialog();
protected slots:
void httpDownload();
void replyFinished(QNetworkReply*reply);
void onDownloadProgress(qint64 bytesSent,qint64 bytesTotal);
void onReadyRead();//
void stop();//暂停,重新下载

private:
QPushButton *download_Btn;
QPushButton *stop_Btn;
QProgressBar *progressBar;
QFile *file;
QFileInfo fileInfo;
QNetworkAccessManager *accessManager;
QNetworkRequest request;
QNetworkReply *reply;
QVBoxLayout *layout;
bool httpRequestAbort; //请求停止的标志位,false表示允许请求

};

#endif // DIALOG_H


dialog.cpp

#include "dialog.h"
#include<QtDebug>

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
download_Btn=new QPushButton("download");
stop_Btn=new QPushButton("stop");
progressBar=new QProgressBar;
progressBar->hide();

layout=new QVBoxLayout();
layout->addWidget(progressBar);
layout->addWidget(download_Btn);
layout->addWidget(stop_Btn);

setLayout(layout);
httpRequestAbort=false;
connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));
connect(stop_Btn,SIGNAL(clicked()),this,SLOT(stop()));

}

Dialog::~Dialog()
{

}
void Dialog::httpDownload(){

QUrl url("<a target=_blank href="http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip">http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip</a>");

fileInfo= url.path();
file=new QFile(fileInfo.fileName());
file->open(QIODevice::WriteOnly);//只读方式打开文件
accessManager=new QNetworkAccessManager(this);
request.setUrl(url);
/******************设置http的header***********************/
// request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
// request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");
//request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());

reply=accessManager->get(request);//通过发送数据,返回值保存在reply指针里.
connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish为manager自带的信号,replyFinished是自定义的
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT( onDownloadProgress(qint64 ,qint64 )));//download文件时进度
connect((QObject *)reply, SIGNAL(readyRead()),this, SLOT(onReadyRead()));
progressBar->setValue(0);
progressBar->show();

}
/***************响应结束**************************/
void Dialog::replyFinished(QNetworkReply *reply){
//获取响应的信息,状态码为200表示正常
QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
QByteArray bytes = reply->readAll();  //获取字节
QString result(bytes);  //转化为字符串
qDebug()<<result;

//无错误返回
if(reply->error() == QNetworkReply::NoError)
{
download_Btn->setText("success");
QByteArray bytes = reply->readAll();  //获取字节
QString result(bytes);  //转化为字符串

qDebug()<<result;
}
else
{
//处理错误
download_Btn->setText("failed");
}

reply->deleteLater();//要删除reply,但是不能在repyfinished里直接delete,要调用deletelater;

}

/***********更新进度条*************/
void Dialog::onDownloadProgress(qint64 bytesSent, qint64 bytesTotal){
progressBar->setMaximum(bytesTotal);
progressBar->setValue(bytesSent);

}

void Dialog::onReadyRead(){

file->write(reply->readAll());
download_Btn->setText("downloading");
}

void Dialog::stop(){
if(!httpRequestAbort)
{
reply->abort();//响应终止
httpRequestAbort=true;
stop_Btn->setText("start");
}
else
{   httpDownload();
httpRequestAbort=false;
stop_Btn->setText("stop");
}

}


main.cpp

#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: