源码是直接在CB上编辑的,需要先安装XMLHTTP4.0组件,修改下也可用在VC平台中
//------------------------------------------------------------------------------
// 通过XMLHTTP从服务器上下载文件到本地
//参数:Httppath:Http路径; szFileName:本地文件名
//------------------------------------------------------------------------------
void URLDownloadToFileByXMLHttp(const AnsiString& Httppath,const AnsiString& szFileName)
{
TServerXMLHTTP40* ServerXMLHTTP401 = new TServerXMLHTTP40(NULL);
ServerXMLHTTP401->open( WideString("GET"),WideString(Httppath), TVariant(false));
ServerXMLHTTP401->setRequestHeader(WideString("Content-Type:"),WideString("application/x-www-form-urlencoded"));
ServerXMLHTTP401->send(TVariant(""));
if(ServerXMLHTTP401->readyState == 4 && ServerXMLHTTP401->status == 200 )
{
fstream outfile;
IStream *pIStream = NULL; //流对象指针
char* buff = NULL;
try
{
VARIANT vValue = ServerXMLHTTP401->get_responseStream();
STATSTG StatStg; //可取得文件长度
pIStream = (IStream*)vValue.punkVal; //取得流对象指针
pIStream->Stat(&StatStg, NULL); //读出状态
unsigned long nSize = ULONG(StatStg.cbSize.QuadPart); //取得文件的长度
buff = new char[nSize];
memset(buff, 0, nSize);
outfile.open(szFileName.c_str(), ios::out | ios::binary);
pIStream->Read(buff,nSize,NULL);
outfile.write(buff,nSize); //写入文件中
/* ULONG uLen;
while(nSize>0)
{
pIStream->Read(buff,min(nSize,1024),&uLen); //取,每次最多1k字节,防止文件过大
outfile.write(buff,uLen); //写入文件中
nSize-=uLen;
}*/
}__finally
{
if(pIStream)
{
pIStream->Release();
pIStream = NULL;
}
outfile.close();
delete[] buff;
delete ServerXMLHTTP401;
}
}
}