• 8710阅读
  • 4回复

[提问]请教关于qt,http使用QNetworkAccessManager下载的问题 [复制链接]

上一主题 下一主题
离线kube1206
 
只看楼主 正序阅读 楼主  发表于: 2013-03-19
我使用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;
}

离线XChinux

只看该作者 4楼 发表于: 2013-03-19
再将http header显示出来,看看到底是什么东西,是不是跳转了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线kube1206
只看该作者 3楼 发表于: 2013-03-19
输出内容是:
data = "<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="http://zz.onlinedown.net:82/down/laolafangkuaijin.rar">here</a></body>"
这应该是跳转吧?
我要下载laolafangkuaijin.rar该怎么解析呢?谢谢了
离线kube1206
只看该作者 2楼 发表于: 2013-03-19
好的,我试一下。
但是,里面下载的源码我是从qt assistant 里面copy的,在qt example and demo 里面运行都没有问题。但是我写到自己的项目里面就有上面那个问题了。
离线XChinux

只看该作者 1楼 发表于: 2013-03-19
你看看它输出的内容到底是什么东西,或许说不定它其实只是一个header location表明跳转呢?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个