所属分类: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对于采用多线程的下载程序,可以按照这个值进行合适的文件分块,确定每个文件块的起点和大小。