블로그 이미지
랜달프

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

    HWND   AllocateHWnd(HINSTANCE hInstance, WNDPROC WndMethod);
    void   DeallocateHWnd(HWND hWnd);
    
    HWND TDownloader :: AllocateHWnd(HINSTANCE hInstance, WNDPROC WndMethod)
    {
    	char sClassName[5];
    
    	sprintf(sClassName, "%d", GetTickCount());
    
    	HWND hWndResult;
    
    	WNDCLASS WndClass;
    
    	WndClass.cbClsExtra = 0;
    	WndClass.cbWndExtra = 0;
    	WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	WndClass.hInstance = hInstance;
    	WndClass.lpfnWndProc = WndMethod;
    	WndClass.lpszClassName = sClassName;
    	WndClass.lpszMenuName = NULL;
    	WndClass.style = CS_HREDRAW | CS_VREDRAW;
    	RegisterClass(&WndClass);
    
    
    	hWndResult = CreateWindowEx(
    					WS_EX_TOOLWINDOW,
    					sClassName,
    					"",
    					WS_POPUP,
    					0,
    					0,
    					0,
    					0,
    					0,
    					0,
    					hInstance,
    					NULL);
    
    
    	if (!hWndResult)
    	{
    		int ErrorCode = GetLastError();
    		ASSERT(0);
    	}
    
    	SetWindowLong(hWndResult, GWL_WNDPROC, (LONG)WndMethod);
    
    	return hWndResult;
    
    }
    
    void TDownloader :: DeallocateHWnd(HWND hWnd)
    {
    	DestroyWindow(hWnd);
    }
    
    
    
    출처 : http://cpueblo.com/programming/api/contents/177.html

    posted by 랜달프
    // WinMain
    #ifndef _DEBUG
    	ShowWindow(hWnd,SW_HIDE);
    #else
    	ShowWindow(hWnd,nCmdShow);
    #endif
    
    
    // WndProc
    #ifndef
    	_DEBUGMoveWindow(hWnd, 0, 0, 0, 0, FALSE);
    #endif
    
    posted by 랜달프

    //////////////////////////////////////////////////////////////////////////////////////////////////
    DLL 부분


    #include <windows.h>

    #pragma data_seg(".kbdata")
    HINSTANCE hModule=NULL;
    HHOOK hKeyHook=NULL;
    HWND g_hWnd=NULL;
    #pragma data_seg()
    #pragma comment (linker, "/SECTION:.kbdata,RWS")

    LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {

     if (nCode>=0)
     {

      SendMessage(g_hWnd,WM_USER+1,wParam,lParam);

     }

     if( wParam == VK_SNAPSHOT )
     {

      OpenClipboard(NULL);
      EmptyClipboard();
      CloseClipboard();

      MessageBoxA(0, "Print Screen 사용 금지", "경고", NULL);
      return true;

     }

     return CallNextHookEx(hKeyHook,nCode,wParam,lParam);

    }


    extern "C" __declspec(dllexport) void InstallHook(HWND hWnd)
    {

     g_hWnd=hWnd;
     hKeyHook=SetWindowsHookEx(WH_KEYBOARD,KeyHookProc,hModule,NULL);

    }

     

    extern "C" __declspec(dllexport) void UninstallHook()
    {

     UnhookWindowsHookEx(hKeyHook);

    }

     

    BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpRes)
    {

     switch (fdwReason)
     {

     case DLL_PROCESS_ATTACH:
        hModule=hInst;
        break;
     case DLL_PROCESS_DETACH:
        break;

     }

     return TRUE;

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////
    코드 부분

    #include <MMSystem.h>

    extern "C" __declspec(dllexport) void InstallHook(HWND);
    extern "C" __declspec(dllexport) void UninstallHook();
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

    ........

    LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    {

     HDC hdc;
     PAINTSTRUCT ps;
     static int count;
     
     switch(iMessage)
     {

     case WM_CREATE:

      InstallHook(hWnd);
      return 0;

     case WM_USER+1:

      wsprintf(Mes2,"입력된 키:%d, lParam : %x ",wParam,lParam);
      InvalidateRect(hWnd,NULL,TRUE);
      return 0;

     case WM_PAINT:

      hdc=BeginPaint(hWnd, &ps);
      TextOut(hdc,10,10,Mes,lstrlen(Mes));
      TextOut(hdc,10,30,Mes2,lstrlen(Mes2));
      EndPaint(hWnd, &ps);
      return 0;

     
     case WM_DESTROY:

      UninstallHook();
      PostQuitMessage(0);
      return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

    }

    posted by 랜달프


    프린트 스크린을 막아보자..
    프린트 스크린은 WM_KEYDOWN이나 다른 이벤트가 떨어지지 않는다..
    단지.. WM_KEYUP이벤트가 발생할 때 VK_SNAPSHOT키로 값이 넘어온다..
    프린트 스크린 키를 눌렀다면 이미 클립보드에 이미지가 들어간 것이다..
    그렇기 때문에 프린트 스크린이 눌리게 되면 키 이벤트를 잡아내고 그 시점에서 클립보드를 지워버리면 된다..

    BOOL CKET_TopFrameDlg::PreTranslateMessage(MSG* pMsg)
    {
     //이렇게는 안된다..왜냐면 이미 KEYDOWN에서 클립보드에 복사가 되었기때문에..
     //if (pMsg->message == WM_KEYUP && pMsg->wParam == VK_SNAPSHOT)
     // return TRUE;


     //  1.  프린트 스크린 키 이벤트를 잡아내고 그 시점에 클립보드를 지워버린다..
     //  print screen, ctrl+print screen은 막기..
     if (pMsg->message == WM_KEYUP && pMsg->wParam == VK_SNAPSHOT)
     {
         ::OpenClipboard(NULL);
         ::EmptyClipboard();
         ::CloseClipboard();
     }
     //  2.  alt+print+screen 막기..
     if (GetKeyState(VK_MENU)&& pMsg->wParam == VK_SNAPSHOT)
     {
         ::OpenClipboard(NULL);
         ::EmptyClipboard();
         ::CloseClipboard();
     }

     return CDialog::PreTranslateMessage(pMsg);
    }

    posted by 랜달프
    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    DWORD dwsma = GetLastError();
    DWORD dwExitCode = 0;
    PROCESSENTRY32 procEntry={0};
    procEntry.dwSize = sizeof( PROCESSENTRY32 );
    Process32First(hndl,&procEntry);
    do {
    if(NULL != strstr(strlwr(procEntry.szExeFile), strlwr("processName")))
    {
    HANDLE hHandle;
    hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,procEntry.th32ProcessID);
    ::GetExitCodeProcess(hHandle,&dwExitCode);
    ::TerminateProcess(hHandle,dwExitCode);
    cout << "killed Process : " << procEntry.szExeFile << " " << procEntry.th32ProcessID << endl;
    break;
    }
    }while(Process32Next(hndl,&procEntry));
    posted by 랜달프
    2009. 1. 7. 14:04 Programming/C programming

    1. stpcpy
    원형 : char *stpcpy( char *dest, char *src );
    헤더 : string.h
    기능 : 문자열 src를 문자배열 dest로 복사한다. dest 의 길이가 src 보다 작은 경우 dest 뒤의 인접 데이터가 파괴된다.
    리턴 : dest + strlen(src)의 번지를 리턴

    2. strcat
    원형 : char *strcat( char *dest, const char *src );
    헤더 : string.h
    기능 : 문자열끼리 연결한다. dest의 널문자 위치에 src가 붙는다. dest의 길이가 ( dest 문자열 + src 문자열 ) 길이보다 작을 경우 인접 데이터가 파괴된다.
    리턴 : dest의 번지가 리턴

    3. strchr
    원형 : char *strchr( const *src, int c );
    헤더 : string.h
    기능 : 문자열 배열 src 내에 문자 c가 있는지 검사하고 있을 경우 문자 c가 있는 번지를 리턴. 널문자도 문자로 취급하기 때문에 널문자를 넣으면 첫번째 널문자의 번지를 리턴한다.
    리턴 : 문자열 src내에서 발견된 문자 c의 포인터. 발견되지 않을 경우 NULL 리턴

    4. strcmp
    원형 : int strcmp( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교함. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    5. strcmpi
    원형 : int strcmpi( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교함. 하지만 대소문자를 구분하지 않는다. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    6. strcoll
    원형 : int strcoll( char *src1, char *src2 );
    헤더 : string.h
    기능 : setlocale 함수에 의해 지정된 비교방식에 따라 두 개의 문자열을 비교
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    7. strcpy
    원형 : char *strcpy( char *dest, const char *src );
    헤더 : string.h
    기능 : 문자열 src를 문자배열 dest로 복사한다. dest 의 길이가 src 보다 작은 경우 dest 뒤의 인접 데이터가 파괴된다.
    리턴 : dest의 번지가 리턴

    8. strcspn
    원형 : size_t strcspn( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 문자열 src1 중에 문자열 src2에 들어 있지 않은 문자들이 연속해 있는 길이를 구한다. 문자열 s2에 없는 문자들로 구성되어 있는 문자열 s1 내의 세그먼트를 찾아내고 그 세그먼트의 길이를 리턴.
    예를 들어 src1 = "123456" 이고 src2 = "0486" 이라면 src1 내에서 src2 의 문자인 4가 나오기 전까지의 길이인 3을 리턴한다.
    리턴 : 찾아낸 세그먼트의 길이.  만약 0을 리턴한다면 세그먼트가 발견되지 않은 것이다.

    9. strdup
    원형 : char *strdup( const char *src );
    헤더 : string.h
    기능 : 새로운 메모리를 할당하고 문자열 src를 복사한 후 그 포인터를 리턴한다. 종료 시 반드시 복제된 문자열은 메모리를 해제해 주어야 한다.
    리턴 : 복제된 문자열의 포인터를 리턴. 메모리 할당에 실패한 경우 NULL을 리턴.

    10. _strerror
    원형 : char *_strerror( const char *src );
    헤더 : string.h, stdio.h
    기능 : 사용자가 정의하는 에러 메시지를 만든다. src가 NULL일 경우 최근 발생한 에러 메시지만으로 구성된 문자열을 만들고 src가 NULL이 아닌 경우 에러메시지 형식의 문자열을 만든다.
    만약 src 가 "babo" 이면 babo : 최근 에러 메시지 같은 형식으로 문자열을 만든다.
    리턴 : 만들어진 에러 문자열의 포인터를 리턴한다.

    11. strerror
    원형 : char *strerror( int errnum );
    헤더 : stdio.h
    기능 : errnum에 해당하는 에러메시지 문자열을 만든다. 에러메시지 문자열은 모두 \n으로 끝나므로 개행 문자를 첨가해 줄 필요는 없다.( 에러 메시지는 이미 정의되어 있으므로 궁금하면 출력시켜보자)
    리턴 : 에러메시지 문자열의 포인터

    12. stricmp
    원형 : int stricmp( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교함. 하지만 대소문자를 구분하지 않는다. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴. 이 함수를 매크로로 정의해 둔 함수가 strcmpi 이다.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    13. strlen
    원형 : size_t strlen( const char *src );
    헤더 : string.h
    기능 : 문자열 src 의 길이를 계산한다. 널문자는 길이에 포함되지 않고 널문자 앞에 까지 문자 개수를 리턴한다.
    리턴 : 문자열의 길이

    14. strlwr
    원형 : char *strlwr(char *src);
    헤더 : string.h
    기능 : 문자열 src 내의 대문자(A~Z)를 소문자(a~z)로 변경한다. 영문자 외의 다른 문자는 변경하지 않는다.
    리턴 : 인수로 주어진 src를 그대로 리턴

    15. strncat
    원형 : char *strncat( char *dest, const char *src, size_t maxlen );
    헤더 : string.h
    기능 : dest 의 널문자에 src의 문자열을 붙이는데 maxlen 길이 만큼만 붙인다.
    리턴 : dest의 번지를 리턴

    16. strncmp
    원형 : int strncmp( const char *src1, const char *src2, size_t maxlen );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분한다. 하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    17. strncmpi
    원형 : int strncmpi( const char *src1, const char *src2, size_t maxlen );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분하지 않는다. 하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    18. strncpy
    원형 : char *strncpy( char *dest, char *src, size_t maxlen );
    헤더 : string.h
    기능 : 문자열을 정해진 길이만큼 복사한다. 길이만큼만 복사하기 때문에 dest의 뒤에 널문자가 붙지 않는다.
    리턴 : dest의 번지를 리턴

    19. strnicmp
    원형 : int strnicmp( const char *src1, const char *src2, size_t maxlen );
    헤더 : string.h
    기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분하지 않는다. 하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다. 이 함수의 매크로 버젼이 strncmpi 이다.
    리턴 : src1 < src2  인 경우 음수 리턴
             src1 = src2  인 경우 0 리턴
             src1 > src2  인 경우 양수 리턴

    20. strset
    원형 : char *strset( char *src, int c );
    헤더 : string.h
    기능 : 문자열을 특정 문자로 채운다. 문자열 중 널문자가 발견될 때가지 문자 c 로 채운다.
    리턴 : src의 번지를 리턴

    21. strpbrk
    원형 : char *strpbrk( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 문자열 src1 내에 문자열 src2에 있는 문자 중의 하나라도 있는지 검사하고 있을 경우 그 포인터를 리턴.
    리턴 : 문자열 src1 내에 문자열 src2에 있는 문자 중 하나가 발견된 포인터를 리턴. 없을 경우 널을 리턴

    22. strrchr
    원형 : char *strrchr( const cjar *src, int c );
    헤더 : string.h
    기능 : 문자 배열 src내에 문자 c가 있는지 검사하고 있을 경우 문자 c가 있는 번지를 리턴한다. 하지만 앞에서 부터 검사하는 것이 아니라 뒤에서 부터 검사를 진행한다.
    리턴 : 문자열 src에서 발견된 문자 c의 포인터를 리턴. 발견되지 않을 경우 널을 리턴.

    23. strrev
    원형 : char *strrev( char *src );
    헤더 : string.h
    기능 : 문자열의 순서를 바꾼다. 즉 제일 앞에 있는 문자가 제일 뒤로 가고 제일 뒤의 문자가 제일 처음으로 옮겨진다. 널문자는 이동 없음.
    리턴 : 역순으로 바꾼 문자열의 src번지

    24. strspn
    원형 : size_t strspn( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 문자열 src1 중에서 문자열 src2에 있는 문자들이 연속해 있는 길이를 구한다.
    예를 들어 src1 = "12345678" 이고 src2 = "143290" 이라면 src1에서 src2의 문자들을 찾아보면 1234가 있다. 이 문자열의 길이 4를 리턴한다.
    리턴 : 찾아낸 세그먼트의 길이를 리턴. 만약 0을 리턴하면 세그먼트를 찾지 못한 것이다.

    25. strstr
    원형 : char *strstr( const char *src1, const char *src2 );
    헤더 : string.h
    기능 : 문자열 src1내에서 문자열 src2가 포함되어 있는지 검사하고 있다면 src2와 같은 문자열이 있는 부분을 리턴한다.
    리턴 : 부분문자열의 선두 번지. 없다면 널을 리턴 

    26. strtod
    원형 : double strtod( const char *src1, char **endptr );
    헤더 : stdlib.h
    기능 : 문자열을 double 형 부동 소수점으로 바꾼다. 문자열은 다음과 같은 구조로 이루어져야 한다.
    [공백,탭][부호][숫자][소수점][e]  -> ex) -5.64e+5, -3.6924
    순서를 어기거나 불필요한 문자가 중간에 있을 경우는 변환이 중지.
    endptr 인수는 변환이 중지될 경우 중지된 문자를 가리키므로 에러 검색에 사용
    리턴 : 변환된 double 형 실수를 리턴. overflow 발생시 HUGE_VAL을 리턴

    27. strtok
    원형 : char *strtok( char *src1, char *src2 );
    헤더 : string.h
    기능 : 문자열에서 token을 찾아낸다. ( token 이란 특정한 구분자로 분리되는 문장 구성 요소이다. 구분자가
    "/"라 할때 다음 문자열은 1994와 Feb와 20의 세 개의 token 으로 분리된다. "1994/Feb/20" )
    문자열 src1이 token을 찾아낼 문자열이며 src2가 token 구분자가 들어있는 문자열이다. token 구분자는 여러개가 복수 개 지정될 수 있으며 token 구분자는 strtok 호출 시 마다 바뀔 수 있다.
    리턴 : 찾아낸 token의 포인터를 리턴. token이 더 이상 없을 경우 널 리턴.
    ( 이해가 안가는 분은 winapi에서 예제를 참고)

    28. strtol
    원형 : long strtol( const char *src1, char **endptr, int radix );
    헤더 : stdlib.h
    기능 : 문자열을 long 형 정수로 변환한다.문자열 src1은 다음과 같은 구조로 이루어져야 한다.
    [공백, 탭][부호][숫자]
    만약 이 순서를 어기거나 불필요한 문자가 문자열 내에 있을 경우 변환은 중지되고 중지된 위치가 endptr에 설정된다. endptr은 에러 검색에 사용하면 용이. 그리고 radix은 문자열을 해석할 진법을 지정할 때 사용되는데 범위는 2~36 까지 이고 그 진법에서 사용되는 문자만 인식
    리턴 : 변환된 long 형 정수를 리턴. 변환이 불가능할 경우 0을 리턴

    29. strtoul
    원형 : unsigned long strtoul(const char *src1, char **endptr, int radix );
    헤더 : string.h
    기능 : 문자열을 부호없는 long 형 정수로 바꾼다. 사용법은 strtol 과 동일.
    리턴 : 변환된 unsigned long 형 정수를 리턴. 변환이 불가능할 경우 0을 리턴

    30. strupr
    원형 : char *strupr( char *src );
    헤더 : string.h
    기능 : 문자열 src내의 소문자 (a~z)를 대문자( A~Z)로 변환한다. 영문자 외의 다른 문자는 변경하지 않는다.
    리턴 : src의 번지를 리턴

    참고 사이트
    www.winapi.co.kr
    http://cafe.naver.com/storygp/34

     

    posted by 랜달프
    2008. 12. 17. 12:58 Web Programming/PHP

    move_uploaded_file
    (PHP 4 >= 4.0.3)

    move_uploaded_file -- 업로드된 파일을 다른곳으로 이동하기


    Description

    bool move_uploaded_file (string filename, string destination)

    이 함수는 PHP 3 에서는 3.0.16 이후, PHP 4 에서는 4.0.2 이후 버전부터 사용할 수 있습니다.

    이 함수는 filename에 의해서 지정된 파일이 PHP의 HTTP POST 파일 업로드 메카니즘을 통해서 업로드된 파일인지 확인합니다. 파일이 유효한 것일때 destination에 주어진 filename으로 이동이 됩니다.

    filename이 유효한 것이 아니면 아무 일도 발생하지 않습니다. 그리고 move_uploaded_file()는 false를 반환합니다.

    filename은 유효하나 어떤 이유가 있어서 이동할 수가 없을 때 아무런 일도 발생하지 않습니다. 그리고 move_uploaded_file()은 false를 반환합니다. 덧붙여서 경고문이 보여집니다.

    이런 체크방법은 파일의내용을 이용자, 같은 시스템내의 다른 사람에게 파일을 손대지 않고 파일의 내용을 감출 수 있는 어떤 기회가 있다면 특별히 더욱 중요합니다.

    posted by 랜달프
    2008. 12. 17. 11:30 Web Programming/PHP

    POST 방식 업로드
    PHP는 RFC-1867 호환 브라우저(넷스케이프 네비게이터 3 이상, 마이크로소프트 인터넷 익스플로러 3 이상을 포함)로부터 파일 업로드를 받을 수 있습니다. 이 기능은 사람들이 텍스트와 바이너리 파일을 동시에 업로드 할 수 있게 합니다. PHP의 인증 및 파일 관리 함수를 이용해서, 업로드를 할 수 있는 사람 및 업로드한 파일의 처리를 완전히 제어할 수 있습니다.

    관련 환경설정: php.ini의 file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size 지시어를 참고하십시오.

    PHP는 넷스케이프 컴포저와 W3C의 Amaya 클라이언트가 사용하는 PUT 방식 파일 업로드도 지원합니다. 자세한 내용은 PUT 방식 지원을 참고하십시오.

    파일 업로드 화면은 다음과 같은 특별한 폼으로 만들어집니다:

    예 20-1. 파일 업로드 폼

    <form enctype="multipart/form-data" action="_URL_" method="post">
     <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
     이 파일을 전송합니다: <input name="userfile" type="file" />
     <input type="submit" value="파일 전송" />
    </form>
     
     


    위 예제의 "_URL_"을 변경하여, PHP 파일을 지시하도록 해야합니다. MAX_FILE_SIZE 히든 필드는 파일 입력 필드 앞에 위치해야 하며, 최대 파일크기(바이트로 지시)를 값으로 가집니다. 또한, 파일 업로드 폼은 enctype="multipart/form-data"을 가지고 있어야 하며, 그렇지 않으면 파일 업로드는 작동하지 않습니다.


    주의
    MAX_FILE_SIZE는 PHP가 확인하기도 하지만, 브라우저에 대한 권고입니다. 이 값을 변경하는건 매우 간단하기에, 크기가 큰 파일을 막기 위해서는 이 기능에 의존해서는 안됩니다. 대신, 최대 크기에 관한 PHP 설정은 속일 수 없습니다. 그러나 MAX_FILE_SIZE 폼 변수는 사용자가 파일이 너무 크다는 것을 파악하기 위해서 실제 전송을 하는 동안 기다릴 필요를 없애줍니다.
     


    업로드한 파일을 정의하는 변수는 PHP 버전과 환경 설정에 따라 달라집니다. 자동 전역 $_FILES가 PHP 4.1.0부터 존재합니다. $HTTP_POST_FILES 배열은 PHP 4.1.0 이전에도 존재합니다. 이 배열들은 업로드 된 파일의 모든 정보를 가지고 있습니다. $_FILES를 사용하는 편을 권장합니다. PHP 지시어 register_globals가 on일때는, 관련된 변수명도 존재합니다. register_globals의 기본값은 PHP 4.2.0부터 off입니다.

    예제 스크립트에서 $_FILES의 내용은 다음과 같습니다. 위 예제 스크립트에서 사용한 파일 업로드 이름 userfile로 표현함에 주의하십시오. 어떠한 이름이라도 가질 수 있습니다.


    $_FILES['userfile']['name']
    클라이언트 머신에 존재하는 파일의 원래 이름.

    $_FILES['userfile']['type']
    브라우저가 이 정보를 제공할 경우에, 파일의 mime 형식. 예를 들면 "image/gif".

    $_FILES['userfile']['size']
    업로드된 파일의 바이트로 표현한 크기.

    $_FILES['userfile']['tmp_name']
    서버에 저장된 업로드된 파일의 임시 파일 이름.

    $_FILES['userfile']['error']
    파일 업로드에 관련한 에러 코드. ['error']는 PHP 4.2.0에서 추가되었습니다.


    참고: PHP 4.1.0 이전 버전에서는 $HTTP_POST_FILES이고, $_FILES와 같은 자동 전역 변수는 존재하지 않습니다. PHP 3는 $HTTP_POST_FILES를 지원하지 않습니다.

    php.ini에서 register_globals가 on일때, 변수가 추가로 사용 가능합니다. 예를 들면, $userfile_name은 $_FILES['userfile']['name']과 동일하고, $userfile_type은 $_FILES['userfile']['type']과 동일합니다. PHP 4.2.0부터 register_globals의 기본값이 off임에 주의하십시오. 이 지시어에 의존하지 않는 방법을 권장합니다.

    php.ini에서 upload_tmp_dir을 이용하여 다른 위치를 지정하지 않는 한, 파일은 서버의 기본 임시 디렉토리에 저장됩니다. 서버의 기본 디렉토리는 PHP를 실행하는 환경의 환경 변수 TMPDIR을 통해서 변경할 수 있습니다. PHP 스크립트 내부에서 putenv()를 통해서 설정하는 것은 작동하지 않습니다. 물론, 이 환경 변수는 업로드된 파일에 다른 작업을 할 때 사용할 수 있습니다. 예 20-2. 파일 업로드 확인하기

    추가 정보는 is_uploaded_file()와 move_uploaded_file()에 대한 함수 정보를 참고하십시오. 다음 예제는 폼에서 전송된 파일 업로드를 처리합니다.

    <?php
    // 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
    // 사용해야 합니다.

    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir . $_FILES['userfile']['name'];

    print "<pre>";
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
      print "파일이 존재하고, 성공적으로 업로드 되었습니다.";
      print "추가 디버깅 정보입니다:\n";
      print_r($_FILES);
    } else {
      print "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
      print_r($_FILES);
    }
    print "</pre>";

    ?> 
     


    업로드된 파일을 받는 PHP 스크립트는 업로드된 파일로 무엇을 할 지 결정하는 로직을 포함하고 있어야 합니다. 예를 들면, $_FILES['userfile']['size'] 변수는 너무 작거나 큰 파일을 처리하는데 이용할 수 있습니다. $_FILES['userfile']['type'] 변수는 형식 기준에 맞지 않는 파일을 처리하는데 이용할 수 있습니다. PHP 4.2.0부터, $_FILES['userfile']['error']를 이용하여 에러 코드에 따라서 처리하게 할 수 있습니다. 어떠한 로직이건 간에, 임시 디렉토리로부터 파일을 지우거나 다른 곳으로 이동해야 합니다.

    폼에서 어떠한 파일도 선택하지 않으면, PHP는 $_FILES['userfile']['size']를 0으로, $_FILES['userfile']['tmp_name']을 none으로 반환합니다.

    요청이 끝날 때, 이동하거나 이름을 변경하지 않은 임시 디렉토리의 파일은 삭제됩니다.


    에러 메세지 설명

    PHP 4.2.0부터, PHP는 파일 배열에 적절한 에러 코드를 반환합니다. 에러 코드는 PHP로 파일을 업로드 했을때 만들어지는 파일 배열의 ['error'] 세그먼트에서 확인할 수 있습니다. 예를 들면, $_FILES['userfile']['error']에서 확인할 수 있을겁니다.

     

    UPLOAD_ERR_OK
    값: 0; 오류 없이 파일 업로드가 성공했습니다.

    UPLOAD_ERR_INI_SIZE
    값: 1; 업로드한 파일이 php.ini upload_max_filesize 지시어보다 큽니다.

    UPLOAD_ERR_FORM_SIZE
    값: 2; 업로드한 파일이 HTML 폼에서 지정한 MAX_FILE_SIZE 지시어보다 큽니다.

    UPLOAD_ERR_PARTIAL
    값: 3; 파일이 일부분만 전송되었습니다.

    UPLOAD_ERR_NO_FILE
    값: 4; 파일이 전송되지 않았습니다.


    참고: 이들은 PHP 4.3.0에서 PHP 상수가 되었습니다.

    posted by 랜달프
    2008. 12. 12. 11:05 Programming/VC++(API,MFC,WTL,ATL)


    #include "stdafx.h"
    #include "UploadTest.h"
    #include "UploadHTTP.h"

    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CUploadHTTP::CUploadHTTP()
    {
      m_strBoundary = _T("kljsladfjlkasjdfljasdkfj");
    }

    CUploadHTTP::~CUploadHTTP()
    {

    }

    BOOL CUploadHTTP::UploadFile(LPCTSTR lpszFilePath, LPCTSTR lpszFileName, _bstr_t* lpStrRemotePath)
    {
      BOOL bResult = FALSE;
      INTERNET_BUFFERS BufferIn;

      HINTERNET hInternet = ::InternetOpen(_T("IDASClient"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);

      if(hInternet == NULL)
        return FALSE;

      HINTERNET hConnection = InternetConnect(hInternet, m_strHost, m_nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
      if(hConnection == NULL)
      {
        ::InternetCloseHandle(hInternet);
        return FALSE;
      }

      HINTERNET hRequest = ::HttpOpenRequest(hConnection, _T("POST"), m_strPageObject, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
      if(hRequest == NULL)
      {
        ::InternetCloseHandle(hConnection);
        ::InternetCloseHandle(hInternet);
        return FALSE;
      }


      // HTTP Header
      _bstr_t strHeader;
      strHeader  = _T("Content-Type: multipart/form-data; boundary=");
      strHeader += m_strBoundary;

      ::HttpAddRequestHeaders(hRequest, (LPCTSTR)strHeader, -1, 0);

     

      // Part Header
      _bstr_t  strFilePartHead("--");
      strFilePartHead += m_strBoundary;
      strFilePartHead += "\r\nContent-Disposition: form-data; name=\"attfile\"; filename=\"";
      strFilePartHead += lpszFileName;
      strFilePartHead += "\"\r\nContent-Type: application/octet-stream\r\n\r\n";

     

      // Part Tail
      _bstr_t  strFilePartTail("\r\n");
      strFilePartTail += "--";
      strFilePartTail += m_strBoundary;
      strFilePartTail += "--\r\n";

     

      BufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
      BufferIn.dwHeadersLength = lstrlen((LPCTSTR)strHeader);
      BufferIn.dwHeadersTotal  = lstrlen((LPCTSTR)strHeader);
      BufferIn.lpcszHeader     = (LPCTSTR)strHeader;
      BufferIn.lpvBuffer       = NULL;
      BufferIn.Next            = NULL;
      BufferIn.dwBufferLength  = 0;
      BufferIn.dwBufferTotal   = GetFileSize(lpszFilePath) + strlen((LPCSTR)strFilePartHead) + strlen((LPCSTR)strFilePartTail);
      BufferIn.dwOffsetHigh    = 0;
      BufferIn.dwOffsetLow     = 0;

     

      if(!::HttpSendRequestEx(hRequest, &BufferIn, NULL, 0, NULL))
      {
        DWORD dwError = GetLastError();

        ::InternetCloseHandle(hRequest);
        ::InternetCloseHandle(hConnection);
        ::InternetCloseHandle(hInternet);
        return FALSE;
      }

     

      // Send Header(반드시 LPCSTR 타입으로 LPCTSTR 타입이면 UNICODE 시 오류)
      DWORD dwWritten = 0;
      InternetWriteFile(hRequest, (LPCVOID)(LPCSTR)strFilePartHead, strlen((LPCSTR)strFilePartHead), &dwWritten);

     

      // Send File content
      WriteFile(hRequest, lpszFilePath);

     

      // Send Tailer(반드시 LPCSTR 타입으로 LPCTSTR 타입이면 UNICODE 시 오류)
      InternetWriteFile(hRequest, (LPCVOID)(LPCSTR)strFilePartTail, strlen((LPCSTR)strFilePartTail), &dwWritten);

     

     

      // 이 문장을 빼먹으면 아래 InternetQueryDataAvailable 실행 시 12019 오류 발생
      // 몇 시간 동안 삽질했음.
      ::HttpEndRequest(hRequest, NULL, 0, NULL);


      // 서버는 올린 파일을 네이밍 룰에 맞춰 저장한 후, 저장된 이름을 알려 주므로
      // 그걸 얻기 위해 필요한 것이지, 일반적인 경우는 알아서..
      DWORD dwSize = 0;
      DWORD dwRead = 0;
      if(InternetQueryDataAvailable(hRequest, &dwSize, 0, 0))
      {
        LPSTR lpszBuff = new char[dwSize+1];
        ZeroMemory(lpszBuff, dwSize+1);
        if(!InternetReadFile(hRequest, (LPVOID)lpszBuff, dwSize, &dwRead))
        {
          DWORD dwErrorCode = GetLastError();
          delete lpszBuff;
        }
        else
        {
          bResult = TRUE;
          delete lpszBuff;
          *lpStrRemotePath = (LPTSTR)lpszBuff;
        }
      }

      HttpEndRequest(hRequest, NULL, 0, 0);

      InternetCloseHandle(hRequest);
      InternetCloseHandle(hConnection);
      InternetCloseHandle(hInternet);

      return bResult;
    }


    BOOL CUploadHTTP::WriteFile(HINTERNET hInternet, LPCTSTR lpszFilePath)
    {
      BYTE chBuff[4096];
      DWORD dwRead = 0;
      DWORD dwWrite = 0;
      DWORD dwErrorCode = 0;
      BOOL  bResult = TRUE;

      HANDLE hFile = CreateFile(lpszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

      if(hFile == INVALID_HANDLE_VALUE)
      {
        dwErrorCode = GetLastError();
        return FALSE;
      }

      while(ReadFile(hFile, (LPVOID)chBuff, 4096, &dwRead, NULL))
      {
        if(dwRead == 0)
          break;

        if(InternetWriteFile(hInternet, (LPCVOID)chBuff, dwRead, &dwWrite) == FALSE)
        {
          bResult = FALSE;
          break;
        }
      }

      CloseHandle(hFile);

      return bResult;
    }

    DWORD CUploadHTTP::GetFileSize(LPCTSTR lpszFilePath)
    {
      DWORD dwLength = 0;
      HANDLE hFile = CreateFile(lpszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

      if(hFile != INVALID_HANDLE_VALUE)
      {
        BY_HANDLE_FILE_INFORMATION  FileInfo;
        GetFileInformationByHandle(hFile, &FileInfo);
        dwLength = FileInfo.nFileSizeLow;
      }

      CloseHandle(hFile);

      return dwLength;
    }

    posted by 랜달프
    2008. 12. 10. 15:57 Programming/VC++(API,MFC,WTL,ATL)

    자세한 세부 내용은 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/ftpcommand.asp 여기를 참고하시면 됩니다.

    CommitUrlCacheEntry
    CreateUrlCacheEntry
    CreateUrlCacheGroup
    DeleteUrlCacheEntry
    DeleteUrlCacheGroup
    FindCloseUrlCache
    FindFirstUrlCacheEntry
    FindFirstUrlCacheEntryEx
    FindFirstUrlCacheGroup
    FindNextUrlCacheEntry
    FindNextUrlCacheEntryEx
    FindNextUrlCacheGroup
    FtpCommand
    FtpCreateDirectory
    FtpDeleteFile
    FtpFindFirstFile
    FtpGetCurrentDirectory
    FtpGetFile
    FtpGetFileSize
    FtpOpenFile
    FtpPutFile
    FtpRemoveDirectory
    FtpRenameFile
    FtpSetCurrentDirectory
    GetUrlCacheEntryInfo
    GetUrlCacheEntryInfoEx
    GetUrlCacheGroupAttribute
    GopherAttributEnumerator
    GopherCreateLocator
    GopherFindFirstFile
    GopherGetAttribute
    GopherGetLocatorType
    GopherOpenFile
    HttpAddRequestHeaders
    HttpEndRequest
    HttpOpenRequest
    HttpQueryInfo
    HttpSendRequest
    HttpSendRequestEx
    InternetAttemptConnect
    InternetAutodial
    InternetAutodialHangup
    InternetCanonicalizeUrl
    InternetCheckConnection
    InternetCloseHandle
    InternetCombineUrl
    InternetConfirmZoneCrossing
    InternetConnect
    InternetCrackUrl
    InternetCreateUrl
    InternetDeInitializeAutoProxyDll
    InternetDial
    InternetErrorDlg
    InternetFindNextFile
    InternetGetConnectedState
    InternetGetConnectedStateEx
    InternetGetCookie
    InternetGetLastResponseInfo
    InternetGetProxyInfo
    InternetGoOnline
    InternetHangUp
    InternetInitializeAutoProxyDll
    InternetLockRequestFile
    InternetOpen
    InternetOpenUrl
    InternetQueryDataAvailable
    InternetQueryOption
    InternetReadFile
    InternetReadFileEx
    InternetSetCookie
    InternetSetDialState
    InternetSetFilePointer
    InternetSetOption
    InternetSetOptionEx
    InternetSetStatusCallback
    InternetStatusCallback
    InternetTimeFromSystemTime
    InternetTimeToSystemTime
    InternetUnlockRequestFile
    InternetWriteFile
    ReadUrlCacheEntryStream
    RetrieveUrlCacheEntryFile
    RetrieveUrlCacheEntryStream
    SetUrlCacheEntryGroup
    SetUrlCacheEntryInfo
    SetUrlCacheGroupAttribute
    UnlockUrlCacheEntryFile
    UnlockUrlCacheEntryStream 
    posted by 랜달프
    prev 1 2 3 4 5 next