Qt通过QNetworkAccessManager实现Http get方法文件下载
2014-08-07 22:29
776 查看
前面已经实现了Qt的网络通信,这里在网络通信的基础上加上文件下载功能。相比与之前的例子添加了QFile与QProgressBar这两个类
dialog.h
dialog.cpp
main.cpp
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(); }
相关文章推荐
- Qt通过QNetworkAccessManager实现Http网络通信
- delphi IdHTTP实现Get方法下载文件,断点续传
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- Android webview通过http get下载文件下载两次的问题及解决方法
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- QT QNetworkAccessManager 如何支持RESTFul的HTTP Patch方法
- 通过隐藏iframe实现文件下载的js方法介绍
- C#实现http协议支持上传下载文件的GET、POST请求
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- QT实现,通过URL下载文件的接口实现
- 通过隐藏iframe实现文件下载的js方法
- js自定义方法通过隐藏iframe实现文件下载
- 越狱iPhone通过网站实现一键安装ipa格式应用的方法、越狱iPhone实现扫二维码直接下载安装ipa文件的方法
- C#实现http协议支持上传下载文件的GET、POST请求
- 如何使用libcurl实现HTTP的GET方法获取文件长度
- Android通过http下载文件实现小记
- 转:C#通过WebClient/HttpWebRequest实现http的post/get方法
- jQuery的ajax()检验用户名;通过jQuery的load()/get()/post()方法实现;使用XMLHTTPRequest对象来进行AJAX的异步数据交互
- Http下载的另一种实现方式,使用QNetworkAccessManager