Qt通過QNetworkAccessManager實現Http get方法文件下載

前面已經實現了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();
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章