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]

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

http서버에 올리는 소스이기 때문에
당연히 서버에 업로드 권한이 있어야 합니다.

[CODE type=c++]



void HttpPutFile(LPCTSTR wszServerURL, LPCTSTR wszRemoteFilePath,
                      LPCTSTR wszLocalFilePath, TCHAR nPort,
                      LPCTSTR wszLoginUserID, LPCTSTR wszLoginPassword )
{
/*
       TCHAR wszServerURL[100]         = L"solergy.com";
       TCHAR wszLocalFilePath[100]     = L"\Program Files\hanaro\Sign_AS\7250.bmp";
       TCHAR wszRemoteFilePath[100]  = L"/hanaro/sign/as/7250.bmp";
       TCHAR wszLoginUserID[100]       = L"";
       TCHAR wszLoginPassword[100]  = L"";
       TCHAR nPort                              = 80;
*/
       HINTERNET hInternet, hURL, hRequest;

       // 연결
       hInternet = InternetOpen( L"HTTPFILE", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
       if ( hInternet == NULL )
       {
               MessageBox( NULL, L"인터넷이 연결되어 있지 않습니다.", L"Warning", MB_OK);
               return;
       }

       // url
       hURL = InternetConnect( hInternet, wszServerURL, nPort,
                                                       wszLoginUserID, wszLoginPassword,
                                                       INTERNET_SERVICE_HTTP, 0, 0);
       if ( hURL==NULL )
       {
               InternetCloseHandle( hInternet );
               MessageBox( NULL, L"서버오류로 연결할 수 없습니다.", L"Warning", MB_OK);
               return;
       }

       INTERNET_BUFFERS        iBuf = {0};
       iBuf.dwStructSize = sizeof( INTERNET_BUFFERS );

       hRequest = HttpOpenRequest( hURL, L"PUT", wszRemoteFilePath, NULL, NULL, NULL, 0, 0 );
       if ( !hRequest )
       {
               InternetCloseHandle( hURL );
               InternetCloseHandle( hInternet );
               MessageBox( NULL, L"Request open Failed", L"Warning", MB_OK);
               return;
       }

       //  local file 오픈
       HANDLE hFile;
       hFile = CreateFile( wszLocalFilePath, GENERIC_READ, FILE_SHARE_READ, NULL,
                                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
       if ( hFile == INVALID_HANDLE_VALUE )
       {
               MessageBox( NULL, L"Invalid read File", L"warning", MB_OK);
               InternetCloseHandle( hRequest );
               InternetCloseHandle( hInternet );
               InternetCloseHandle( hURL );
               return;
       }


       DWORD dwWritten;
       DWORD dwFileSize, dwFilePos=0, dwRead;

       dwFileSize = GetFileSize( hFile, NULL );
       iBuf.dwBufferTotal = dwFileSize;

       if( !HttpSendRequestEx( hRequest, &iBuf, NULL, HSR_INITIATE, 0 ) )
       {
               MessageBox( NULL, L"SendRequest Failed", L"warning", MB_OK);
               CloseHandle( hFile );
               InternetCloseHandle( hRequest );
               InternetCloseHandle( hInternet );
               InternetCloseHandle( hURL );
               return;
       }

       char buf[512];
       DWORD cnt=0;
       dwFilePos = 0;
       do
       {
               SetFilePointer( hFile, dwFilePos, NULL, FILE_BEGIN );
               if( !ReadFile( hFile, buf, sizeof(buf), &dwRead, NULL) )
               {
                       MessageBox( NULL, L"Local File read error", L"Warning", MB_OK);
                       break;
               };

               InternetSetFilePointer( hRequest, dwFilePos, NULL, FILE_BEGIN, 0 );
               if( !InternetWriteFile( hRequest, buf, dwRead, &dwWritten ) )
               {
                       MessageBox( NULL, L"Remote File write error", L"Warning", MB_OK);
                       break;
               };
               dwFilePos += dwWritten;

       } while ( dwRead == sizeof(buf) );


       CloseHandle( hFile );

       if( !HttpEndRequest( hRequest, NULL, 0, 0 ) )
       {
               MessageBox( NULL, L"EndRequest Failed", L"warning", MB_OK);
       }

       InternetCloseHandle( hRequest );
       InternetCloseHandle( hInternet );
       InternetCloseHandle( hURL );

}

[/HTML][/CODE]