Dev/C, C++

Http프로토콜을 이용한 파일 다운로드

newtype 2003. 1. 23. 18:12
//-------------------------------------------------------------------------------------//  
// Function    : GetFile  
// Parameter: LPCTSTR url, LPCTSTR filename  
// Return    : CString              
//            - 성공하면 "YES" 실패하면 에러메시지를 반환  
// Note        : url의 파일을 받아서 filename에 저장한다.  
//            LPCTSTR url      - http프로토콜을 이용해 받아올 파일의 전체경로  
//            LPCTSTR filename - 파일을 저장할 local경로  
//-------------------------------------------------------------------------------------//  
CString CInternetImageCtrl::GetFile(LPCTSTR url, LPCTSTR filename)  
{  
  HINTERNET hInternet, hURL;  

  // 연결  
  hInternet = InternetOpen( L"HTTPFILE", INTERNET\_OPEN\_TYPE\_PRECONFIG, NULL, NULL, 0);  

  if ( hInternet == NULL )  
     return L"인터넷이 연결되어 있지 않습니다.";  

// url  
  hURL = InternetOpenUrl( hInternet, url, NULL, 0, INTERNET\_FLAG\_RELOAD, 0);  
  if ( hURL==NULL )  
  {  
     InternetCloseHandle( hInternet );  
     return L"서버오류로 연결할 수 없습니다.";  
  }  

  // 연결정보 확인  
  TCHAR szStatusCode\[10000\];  
  DWORD dwInfoSize = 10000;  
  HttpQueryInfo(hURL, HTTP\_QUERY\_STATUS\_CODE, szStatusCode, &dwInfoSize, NULL);  


  long nStatusCode = \_ttol(szStatusCode);  
  if (nStatusCode == HTTP\_STATUS\_OK)  
  { // 정상  

     //  local file 생성  
     HANDLE hFile;  
     hFile = CreateFile( filename, GENERIC\_WRITE, 0, NULL,  
                         CREATE\_ALWAYS, FILE\_ATTRIBUTE\_NORMAL, NULL );  

     DWORD size;  
     DWORD dwRead, dwWritten; //, Recv=0;  
     char\* buf = NULL;  

     do  
     {  
        InternetQueryDataAvailable( hURL, &size, 0, 0 );  
        buf = new char\[size\];  
        InternetReadFile( hURL, buf, size, &dwRead );  

        WriteFile( hFile, buf, dwRead, &dwWritten, NULL );  
        delete buf;  

     } while ( dwRead != 0 );  

     CloseHandle( hFile );  

  }  
  else if (nStatusCode == HTTP\_STATUS\_NOT\_FOUND)  
  { // 404에러  
     InternetCloseHandle( hInternet );  
     InternetCloseHandle( hURL );  
     return L"그림이 준비되지 않았습니다";  
  } else  
  { // 그외의 에러..  
     InternetCloseHandle( hInternet );  
     InternetCloseHandle( hURL );  
     CString str;  
     str.Format( L"Unknown Error  
Err code : %d", nStatusCode);  
     return str;  
  }  

  InternetCloseHandle( hInternet );  
  InternetCloseHandle( hURL );  

  return L"YES";  
}  
반응형