Qt HTTP上传文件

QT HTTP上传文件,主要功能在uploadFile函数中

#ifndef HTTPMANGER_H
#define HTTPMANGER_H

#include <QObject>
#include <QNetworkReply>
class QNetworkAccessManager;
class LoadingWidget;
class HTTPManger : public QObject
{
    Q_OBJECT
public:
    explicit HTTPManger(QObject *parent = 0);
    explicit HTTPManger(const QString& url, QObject *parent = 0);
    ~HTTPManger();
    void setUrl(const QString& url);

    ///上传文件, filepath: 文件路径, url:上传地址
    void uploadFile(const QString& filePath, const QUrl& url);
    ///检查更新
    void updataCheck();
signals:
    void readFinished(QString);

    void replyFinished(int statusCode);
    void sigProgress(qint64,qint64);
    void sigHTTPError(const QString& error);
public slots:

private slots:
    void httpFinished(QNetworkReply *);
    void uploadReplyFinished(QNetworkReply*);
    void onLoadError(QNetworkReply::NetworkError error);
private:
    QNetworkAccessManager *m_accessManager;
    QNetworkReply         *m_reply;

    QString m_url;
    LoadingWidget* m_pLoadWidget;
};

#endif // HTTPMANGER_H
#include "HTTPManger.h"
#include "Model/VTMAppInfo.h"
//#include "Utils/LoadingWidget.h"
#include "Utils/VTMFileUtils.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QHttpMultiPart>
#include <QAuthenticator>
#include <QHttpPart>
#include <QFile>
#include <QFileInfo>
#include <QDataStream>

HTTPManger::HTTPManger(QObject *parent) :
    QObject(parent),
    m_reply(NULL),
    m_accessManager(NULL)
{

}

HTTPManger::HTTPManger(const QString &url, QObject *parent)
    : QObject(parent),
      m_url(url)
{

}

HTTPManger::~HTTPManger()
{
    if(m_accessManager != NULL)
    {
        delete m_accessManager;
        m_accessManager = NULL;
    }
}

void HTTPManger::setUrl(const QString &url)
{
    m_url = url;
}

void HTTPManger::uploadFile(const QString &filePath,const QUrl& url)
{
    if(m_accessManager == NULL)
    {
        m_accessManager = new QNetworkAccessManager(this);
    }
    m_accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart zipPart;
    QString header = QString("form-data; name=\"%1\"; filename=\"%2\"")
            .arg("file").arg(QFileInfo(filePath).fileName());
    zipPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header));
    zipPart.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
    QFile *file = new QFile(filePath);
    if(!file->open(QIODevice::ReadOnly))
    {
        emit sigHTTPError(filePath + "open failed");
        return;
    }

    zipPart.setBodyDevice(file);
    file->setParent(multiPart);
    multiPart->append(zipPart);

    QNetworkRequest request(url);
    m_reply = m_accessManager->post(request, multiPart);
    multiPart->setParent(m_reply);


    connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this,SLOT(onLoadError(QNetworkReply::NetworkError)));
    connect(m_accessManager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(uploadReplyFinished(QNetworkReply*)));
    connect(m_reply, SIGNAL(uploadProgress(qint64,qint64)),
            this, SIGNAL(sigProgress(qint64,qint64)));

}

void HTTPManger::updataCheck()
{
    if(m_accessManager == NULL)
    {
        m_accessManager = new QNetworkAccessManager(this);
    }
    QUrl url("http://www.easypano.com/forsoftware/CheckUpdate.aspx");
    QByteArray format("SystemInfo=Windows&");
    format.append("ProductName=MyTEST&");
    QString version = VTMAppInfo::gAppInfo()->fileVersion();
    qDebug(version.toStdString().data());
    format.append("Version=").append(version);
    QNetworkRequest quest(url);
    quest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    m_reply = m_accessManager->post(quest, format);

    connect(m_accessManager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(httpFinished(QNetworkReply*)));
}

void HTTPManger::httpFinished(QNetworkReply* reply)
{
    //m_pLoadWidget->stop();
    if(reply->error() == QNetworkReply::NoError)
    {
        QString str = m_reply->readAll();
        qDebug()<<str;
        emit readFinished(str);
    }
    else
    {
        QString strError = QString("HTTP error: %1").arg(reply->errorString());
        qDebug()<<strError;
        emit sigHTTPError(strError);
    }

    reply->deleteLater();
}

void HTTPManger::uploadReplyFinished(QNetworkReply *reply)
{
    if(reply->error() == QNetworkReply::NoError)
    {
        QString backStr = reply->readAll();
        emit readFinished(backStr);
        qDebug(backStr.toStdString().data());
    }
    else
    {
        emit sigHTTPError(reply->errorString());
    }

    reply->deleteLater();
}

void HTTPManger::onLoadError(QNetworkReply::NetworkError)
{
    qCritical(m_reply->errorString().toStdString().data());
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值