需要头文件afxinet.h
//返回值解析:
// 0:成功下载保存
//- 1:URL不正确
//- 2:建立网络连接失败
//- 3:向服务器发起GET请求失败
//- 4:服务器不接受请求
//- 5:参数一不能为空
//- 6:参数二不能为空
//- 7:保存文件时创建或写入文件失败
INT GetInternetFile(const CString fileUrl,const CString fileName){
if (fileUrl.IsEmpty())
return -5;
unsigned short nPort;//服务器端口号
CString Server, FileObject;
DWORD dwServiceType, dwRet;//服务类型,GET请求的状态号
//解析URL
if (!AfxParseURL(fileUrl, dwServiceType, Server, FileObject, nPort)){
//MessageBox(_T("解析URL失败"));
return -1;
}
//创建网络连接对象,http连接对象指针和用于该连接的文件指针,注意delete
CInternetSession intsess;
CHttpFile * pHtFile = NULL;
//建立连接
CHttpConnection * pHtCon = intsess.GetHttpConnection(Server, nPort);
if (pHtCon == NULL){
intsess.Close();
//MessageBox(_T("建立连接失败"));
return -2;
}
//发起Get请求
pHtFile = pHtCon->OpenRequest(CHttpConnection::HTTP_VERB_GET, FileObject);
if (pHtFile == NULL){
intsess.Close();
delete pHtCon;
pHtCon = NULL;
//MessageBox(_T("Get请求失败"));
return -3;
}
//提交请求
pHtFile->SendRequest();
//获取状态号
pHtFile->QueryInfoStatusCode(dwRet);
if (dwRet != HTTP_STATUS_OK){
intsess.Close();
delete pHtCon;
pHtCon = NULL;
delete pHtFile;
pHtFile = NULL;
//MessageBox(_T("服务器不接受请求"));
return -4;
}
//获取文件大小
UINT nFileLen = (UINT)pHtFile->GetLength();
DWORD dwRead = 1;//用于表示读取的数量
//创建缓冲区
char * szBuffer = new char[nFileLen + 1];
try{
//创建文件,下载文件重命名为fileName
CFile newFile(fileName, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
while (dwRead>0){
memset(szBuffer, 0, (size_t)(nFileLen + 1));
dwRead = pHtFile->Read(szBuffer, nFileLen);
newFile.Write(szBuffer, dwRead);
}
newFile.Close();
delete[]szBuffer;
delete pHtFile;
delete pHtCon;
intsess.Close();
}
catch(CFileException e){
delete[] szBuffer;
delete pHtFile;
delete pHtCon;
intsess.Close();
//MessageBox(_T("文件读写异常"));
return -7;
}
return 0;
}