文件下载支持http和https

来源:互联网 发布:坏嘟嘟永久域名 编辑:程序博客网 时间:2024/06/06 06:59

//下载文件
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;
}