我使用QNetworkAccessManager进行
http下载。当URL = “
http://www.qq.com",的时候,下载的index.html网页可以打开,但是当URL = “
http://zz.onlinedown.net/down/laolafangkuaijin.rar"的时候,下载的是
laolafangkuaijin.rar这个文件包,但是只有1kb.原始文件是6M多。我是在VS2008上面开发的,以下是源码。请教各位大神是怎么回事?在线等,非常感谢。 头文件: #ifndef UPDATEMGR_H
#define UPDATEMGR_H
#include <QWidget>
#include <QObject>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QMessageBox>
#include <QNetworkReply>
#include <QSslError>
#include <QAuthenticator>
#include <QFileInfo>
#include <QtNetwork>
class UpdateMgr : public QObject{
Q_OBJECT
public:
static UpdateMgr* getInstance();
static void release();
/************************************************************************
下载新版本:
0:下载失败;
1:下载成功;
2:下载被异常中断;
************************************************************************/
int downNewVersion();
/************************************************************************
安装新版本:
0:安装失败;
1:安装成功;
2:安装被异常中断;
************************************************************************/
int installNewProject();
void startRequest(QUrl url);
~UpdateMgr();
private:
UpdateMgr();
static UpdateMgr* pThis;
UpdateUi updateUi;
QUrl url;
QNetworkAccessManager manager;
QNetworkReply *reply;
QFile *file;
int httpGetId;
bool httpRequestAborted;
bool isExistNew;
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64 bytesRead, qint64 totalBytes);
};
#endif // UPDATEMGR_H
源文件:
#include "UpdateMgr.h"
#include <QtGui>UpdateMgr* UpdateMgr::pThis = NULL;
UpdateMgr::UpdateMgr()
{
isExistNew = false;
file = NULL;
reply = NULL;
}UpdateMgr::~UpdateMgr()
{
}UpdateMgr* UpdateMgr::getInstance()
{
if(pThis == NULL){
pThis = new UpdateMgr();
}
return pThis;
}
void UpdateMgr::release()
{
if (pThis != NULL){
delete pThis;
pThis = NULL;
}
}
int UpdateMgr::downNewVersion()
{
//URL通过本地配置文件获取,可以指定; //url = QObject::tr("
http://www.qq.com");
url = QObject::tr("
http://zz.onlinedown.net/down/laolafangkuaijin.rar");
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
if (fileName.isEmpty())
fileName = "index.html";
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
delete file;
file = 0;
return 0;
}
httpRequestAborted = false;
isExistNew = true;
startRequest(url);/** 这是我定义的一个
显示下载进度的UI,可以忽略
updateUi.setUp();
updateUi.exec();
**/
return 1;
}
int UpdateMgr::installNewProject()
{
return 0;
}void UpdateMgr::startRequest(QUrl url)
{
reply = manager.get(QNetworkRequest(url));
QObject::connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); //下载完成后;
QObject::connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); //有可用
数据时;
QObject::connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(updateDataReadProgress(qint64,qint64))); //更新进度条;
}
void UpdateMgr::httpReadyRead()
{
if (file){
file->write(reply->readAll());
}
}void UpdateMgr::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
if(isExistNew){
updateUi.setProgressBarValues(bytesRead,totalBytes);
}
}
void UpdateMgr::httpFinished()
{
if(isExistNew){
updateUi.setButtonStatus(true);
}
if (httpRequestAborted) {
if (file) {
file->close();
file->remove();
delete file;
file = 0;
}
reply->deleteLater();
//progressDialog->hide();
return;
} //progressDialog->hide();
file->flush();
file->close();
QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (reply->error()) {
file->remove();
} reply->deleteLater();
reply = NULL;
delete file;
file = NULL;
}