Windows/MFC

HTTP file download

aucd29 2013. 10. 2. 18:23
웹에서 파일을 다운로드하려면 어떻게 해야되나 궁금했는데
아래같이 하면 간단하게 웹에 올라온 파일들을 다운로드 받을 수 있다.

getFileFromHttp("http://tattertools.com/ko/tistoryBanner01.gif", "tistoryBanner01.gif");

이미지 파일을 다운 받으려면 어떻게 해야되는지 몰라서 한참 해맸다.
URL에는 파일명까지 들어가야된다. 그리고 저장할 파일의 이름을 지정한다.
특정 폴더에 파일을 저장하려면 저장할 파일에 패스를 입력하면된다.
예를 들어 URL을 이렇게 주고 "http://wwwi.tistory.com/"
저장할 파일을 "test.html"로 주면 http://wwwi.tistory.com/의 첫페이지가 test.html로 저장된다.


[code]
#include "Wininet.h"     // 밑의 함수를 쓰려면 이 라인을 반드시 추가해야 됨
#define READ_BUF_SIZE    1024

// 웹상의 파일을 다운로드
int getFileFromHttp(char* pszUrl, char* pszFile)
{
    HINTERNET    hInet, hUrl;
    DWORD        dwReadSize = 0;

    // WinINet함수 초기화
    if ((hInet = InternetOpen("MyWeb",            // user agent in the HTTP protocol
                    INTERNET_OPEN_TYPE_DIRECT,    // AccessType
                    NULL,                        // ProxyName
                    NULL,                        // ProxyBypass
                    0)) != NULL)                // Options
    {
        // 입력된 HTTP주소를 열기
        if ((hUrl = InternetOpenUrl(hInet,        // 인터넷 세션의 핸들
                    pszUrl,                        // URL
                    NULL,                        // HTTP server에 보내는 해더
                    0,                            // 해더 사이즈
                    0,                            // Flag
                    0)) != NULL)                // Context
        {
            FILE    *fp;

            // 다운로드할 파일 만들기
            if ((fp = fopen(pszFile, "wb")) != NULL)
            {
                TCHAR    szBuff[READ_BUF_SIZE];
                DWORD    dwSize;
                DWORD    dwDebug = 10;

                do {
                    // 웹상의 파일 읽기
                    InternetReadFile(hUrl, szBuff, READ_BUF_SIZE, &dwSize);

                    // 웹상의 파일을 만들어진 파일에 써넣기
                    fwrite(szBuff, dwSize, 1, fp);
                    dwReadSize += dwSize;
                } while ((dwSize != 0) || (--dwDebug != 0));

                fclose( fp );
            }

            // 인터넷 핸들 닫기
            InternetCloseHandle(hUrl);
        }

        // 인터넷 핸들 닫기
        InternetCloseHandle(hInet);
    }

    return(dwReadSize);
}

void CDownloadFromHttpDlg::OnBnClickedOk()
{
    getFileFromHttp("http://tattertools.com/ko/tistoryBanner01.gif", "tistoryBanner01.gif");

    OnOK();
}
[/code]

// 나는 libcurl 쓰지만... 다른분이 필요한 것 같아서 테스트용으로 생성
// 근데 이거 호출하기 전에 thread 호출해야 보임..