//下载文件
BOOL CUpdateDlg::HttpDownLoad(const CString &strURL, const CString &saveName)
{
BOOL bRet = FALSE;
DWORD dwServerType = 0;
CString strServer, strObj;
INTERNET_PORT nPort = 0;
if (!AfxParseURL(strURL, dwServerType, strServer, strObj, nPort) || !(dwServerType == AFX_INET_SERVICE_HTTPS || dwServerType == AFX_INET_SERVICE_HTTP))
return FALSE;
DWORD dwFlags = INTERNET_FLAG_DONT_CACHE
| INTERNET_FLAG_EXISTING_CONNECT
| INTERNET_FLAG_KEEP_CONNECTION
| INTERNET_FLAG_RELOAD;
if (dwServerType == AFX_INET_SERVICE_HTTPS)
dwFlags |= (INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | INTERNET_FLAG_SECURE);
HANDLE hSession = ::InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = ::InternetConnect(hSession,
strServer,
nPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
dwFlags,
0);
if (hConnect == NULL)
return FALSE;
HINTERNET hFile = ::HttpOpenRequest(hConnect,
_T("GET"),
strObj,
NULL,
NULL,
NULL,
dwFlags,
0);
if (hFile == NULL)
{
::InternetCloseHandle(hConnect);
return FALSE;
}
if (dwServerType == AFX_INET_SERVICE_HTTPS)
{
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
::InternetQueryOption (hFile, INTERNET_OPTION_SECURITY_FLAGS,
(LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
::InternetSetOption (hFile, INTERNET_OPTION_SECURITY_FLAGS,
&dwFlags, sizeof (dwFlags) );
}
CFile saveFile;
CFileException fileException;
//创建文件
if (!saveFile.Open(saveName, CFile::modeCreate | CFile::modeReadWrite, &fileException))
{
return FALSE;
}
//进度条显示
//...
if (::HttpSendRequest(hFile, NULL, 0, NULL, 0))
{
DWORD dwStatus = 0;
DWORD dwSize = sizeof(dwStatus);
DWORD dwIndex = 0;
if (::HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwSize, &dwIndex) && dwStatus == HTTP_STATUS_OK)
{
//查询文件大小
DWORD dwFileSize = 0;
dwSize = sizeof(dwFileSize);
::HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwFileSize, &dwSize, &dwIndex);
m_fileSize = dwFileSize;
m_downSize = 0;
char buffer[ 1024 ];
DWORD dwRead = 0;
while (::InternetReadFile(hFile, buffer, sizeof(buffer), &dwRead) && dwRead > 0)
{
m_downSize += dwRead;
saveFile.Write(buffer, dwRead);
}
bRet = TRUE;
}
}
saveFile.Close();
::InternetCloseHandle(hFile);
::InternetCloseHandle(hConnect);
//文件大小不对
if(m_downSize != m_fileSize)
{
bRet = FALSE;
}
return bRet;
}