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());
}