CHttpFile::QueryInfo

所属分类:VC/MFC 网络编程
-----------------------------------------

我的程序通过CHttpFile下载网络上的文件,我是这样干的

CInternetSession     sess ;
...
CHttpFile     * pF = (CHttpFile*)sess.OpenURL(strFileURL, 1, dwFlag);
...
pF->QueryInfo (HTTP_QUERY_STATUS_CODE, str) ;
if (str != _T("200"))    return -1;

pF->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str) ; // file's length
...
后面就是通过Read读取网络文件数据.

我现在的问题是通过QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str)得到文件大小不正确.我需要下载的文件大小是20M,可是得到的文件大小只有80K.为什么啊?
大家有什么方法能得到正确的文件大小啊

另外问下,大家用http下载文件的时候一般用什么方法啊?我这里用的是CInternetSession ,CHttpFile.
谢谢



----------------------------------------------------------------------

应该是ASP页面被重定向了吧.
要用重定向后的地址再做连接.

--------------------------------------------------------

请参考:
void       OnFileGet()            
    {        
        char       m_URL[]       =       "http://www.csdn.net/images/ad/hero_banner.gif";        
        CString       strServer,strObject;    
        CString       szHeaders;    
        INTERNET_PORT       nPort;    
        CInternetSession       session("My       Sesssion");    
        CHttpConnection       *       pServer       =       NULL;    
        CHttpFile                   *       pFile               =       NULL;    
        DWORD       dwRet       ,       dwRead;    
        DWORD       nServiceType;    
        char       szBuff[1024*100];    
         
        if(TRUE!=AfxParseURL(m_URL,nServiceType,strServer,strObject,nPort))    
        {        
              delete       pServer;    
      AfxMessageBox("URL       error");    
      return;                
        }    
        pServer     =       session.GetHttpConnection(       strServer,       nPort);    
        pFile         =       pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject);    
        pFile->SendRequest();    
        pFile->QueryInfoStatusCode(dwRet);    
        if       (dwRet       ==       HTTP_STATUS_OK)      
        {    
         
                memset(       szBuff,       0,       sizeof(szBuff));    
        DWORD       dwFileLen=pFile->GetLength();      
        CString     str;    
        str.Format("filelen=%d",dwFileLen);    
                AfxMessageBox(str);      
        DWORD     ret;    
        dwRead=10;    
        ret=0;    
        HANDLE     hFile;    
        hFile=CreateFile("d:\\hero_banner.gif",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    
                while(dwRead>0)    
                {      
                        dwRead=pFile->Read(szBuff,sizeof(szBuff)-1);        
        WriteFile(hFile,szBuff,dwRead,&ret,NULL);    
        }    
        CloseHandle(hFile);    
        }    
        delete       pFile;    
        delete       pServer;    
        session.Close();          
    }    


--------------------------------------------------------

HTTP_QUERY_CONTENT_LENGTH只是返回本次请求得到数据的长度,如果要得到整个文件的大小,用HTTP_QUERY_CONTENT_RANGE,然后解析得到的字符串,就可以了。

--------------------------------------------------------

我一般下载的时候都是用API来做
InternetOpen
InternetOpenUrl
HttpQueryInfo
InternetReadFile

--------------------------------------------------------

设断点调试一下吧..看接收回来的buffer是什么..有可能接收到的只是重定向的网页..

--------------------------------------------------------

LONGcb= 0;

pFile = (CHttpFile*)session.OpenURL(strURLRequest, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
CString strTmp;
          pFile->ReadString(strTmp);
cb=strTmp.GetLength();

--------------------------------------------------------

MARK

--------------------------------------------------------

pFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,&dwFileLength,&dwSizeOfRq);

--------------------------------------------------------

读取待下载的文件的信息并分析
     在发送请求后,可以使用HttpQueryInfo函数获取文件的有关信息,或者取得服务器的信息以及服务器支持的相关操作。对于下载程序,最常用的是传递HTTP_QUERY_CONTENT_LENGTH参数取得文件的大小,即文件包含的字节数。模块如下所示:
     // 取得待下载文件的大小
     int __fastcall THttpGetThread::GetWEBFileSize(void)
     {
         try
         {
             DWORD BufLen=HTTPGET_BUFFER_MAX;
             DWORD dwIndex=0;
             bool RetQueryInfo=HttpQueryInfo(FhRequest,
                         HTTP_QUERY_CONTENT_LENGTH,
                         Buffer, &BufLen,
                         &dwIndex);
             if( RetQueryInfo==false) throw(Exception("Error:HttpQueryInfo"));
             DoOnStatusText("ok:HttpQueryInfo");
             int FileSize=StrToInt(Buffer); // 文件大小
             DoOnGetFileSize(FileSize);
         }catch(Exception &exception)
         {
             DoOnStatusText(exception.Message);
         }
         return FileSize;
     }
     模块中的DoOnGetFileSize是发出取得文件大小的事件。取得文件大小后,+}r.T教网[EjA0供z4zJIx的;X网教$lF垠提3对于采用多线程的下载程序,可以按照这个值进行合适的文件分块,确定每个文件块的起点和大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值