본문 바로가기

it/c

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

[CODE type=c++]
//-------------------------------------------------------------------------------------//
// 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";
}


[/HTML][/CODE]

태그

, , ,