天天看點

利用MFC Internet類請求圖檔資料

void GetGifFromInternet() 

    CInternetSession interSess; 

    CHttpConnection* pHttpConn = interSess.GetHttpConnection(_T("www.baidu.com"), // A line 

        (INTERNET_PORT)INTERNET_DEFAULT_HTTP_PORT, NULL, NULL); 

    if (NULL == pHttpConn) 

        return; 

    // 這個函數的參數相當于設定HTTP頭,第二個參數指出所要請求的資源web子路徑,它這裡是請求圖檔/img/baidu_sylogo1.gif,它的根路徑是www.baidu.com, 

    // 也就是A line第一個參數www.baidu.com.最終,系統會形成所請求資源的全路徑:http://www.baidu.com/img/baidu_sylogo1.gif 

    // 對于第3個參數,從msdn描述來看,似乎是指出資源(baidu_sylogo1.gif)的路徑,不過它為可以為NULL,似乎沒有用,也就是說它不會影響資源 

    // 全路徑的組合,不會影響C line的調用.不曉得怎麼回事???????. 

    // 第5個參數ppstrAcceptTypes指出請求資源的類型,預設為text/*,也就是文本,如果你請求的是圖檔,那麼要包含圖檔類型,例如img/gif等.可以看出 

    // 應該傳入LPCTSTR數組指針,但是很奇怪,數組的值怎麼樣,都會導緻函數執行失敗,那麼要為這個數組傳遞怎樣的值才能成功調用該函數呢? 

    DWORD dwFlag = INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES; 

    CHttpFile* phttpfile = pHttpConn->OpenRequest(_T("GET"), _T("/img/baidu_sylogo1.gif")); // B Line 

    if (NULL == phttpfile) 

    // A line 和 B line會組合成完整的URL:http://www.baidu.com/img/baidu_sylogo1.gif 

    // 且該函數會傳回該URL.B行的第3個參數不會影響C調用傳回值. 

    // 也就是說,如果A line第1個參數和B line第2個參數設定不正确,則不能夠組合成一個有效的URL,會導緻 

    // 下面對SendRequest函數調用錯誤. 

    CString url = phttpfile->GetFileURL(); // C line 

    // A line,B line 都相當于添加了HTTP頭,然而程式可能會修改這個HTTP頭,D line的調用提供了一種修改HTTP頭的方法. 

    // 可以添加,修改,替代等.在這裡, D line的目的僅僅是修改了HTTP頭中Accept的的值,指出用戶端可以接收的資料,可以 

    // 看到它包含image/gif,指出可以接收gif檔案.如果不指定這一項,OS預設隻接受text/*,也就是文本資料. 

    // 注意: HTTP頭有多項,OS預設設定了一些,是以程式可以省略,有些項是可以沒有的. 

    // HTTP頭不是那麼容易寫的,在程式設計可以在浏覽器中請求某個資源,然後用抓包工具抓取到這個資料包,然後就可以看到HTTP頭 

    // 的,将該HTTP頭中的内容選擇必要的部分複制下來,在這裡組合成字元串即可. 

    // 這個HTTP頭有些是可省略的,至于哪些可以省略,這就需要先測試一下. 

    LPCTSTR lpHeader =   

    _T("GET /img1/baidu_sylogo1.gif /HTTP/1.1") // a1 

    _T("Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*") 

    _T("Accept-Language: zh-CN") //a2 

    _T("Host: www.baidu.com") //a3 

    _T("User-Agent: MFCAppTest.exe") 

    _T("Connection: Keep-Alive")//a4 

    _T("\r\n\r\n"); 

    // 如果dwFlags==HTTP_ADDREQ_FLAG_ADD_IF_NEW,a1,a2,a3,a4也可以省略. 

    BOOL bRet = phttpfile->AddRequestHeaders(lpHeader);// D line 

    DWORD dwErr = ::GetLastError(); 

    // 請求的資源路徑不能改變,它的值仍然應同 C Line調用時相同. 

    url = phttpfile->GetFileURL(); // E line  

    bRet = phttpfile->SendRequest(); // F line 發送請求gif檔案資料的請求. 

    CString ojb = phttpfile->GetObject(); // 擷取的資源名稱,這裡是baidu_sylogo1.gif 

    TCHAR buf[BUF_4096] = {0}; 

    DWORD dwBytes = BUF_4096-1; 

    DWORD dwIndex = 0; 

    // HTTP_QUERY_CONTENT_TYPE 如果F line執行成功,這裡應該傳回img/gif. 

    bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, buf, &dwBytes, &dwIndex); 

    dwErr = ::GetLastError(); 

    // 請求到的資料長度,也就是baidu_sylogo1.gif的大小. 

    dwBytes = BUF_4096-1; 

    dwIndex = 0;         

    bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, buf, &dwBytes, &dwIndex); 

    int len = phttpfile->GetLength(); 

    // 讀取baidu_sylogo1.gif檔案資料,然後以二進制形式儲存下來. 

    int nBytes = _tstoi(buf); 

    dwBytes = phttpfile->Read(buf, nBytes); 

    FILE* file = fopen("g:\\pic.gif", "wb"); 

    fwrite(buf, nBytes, 1, file); // 儲存之後可以看到pic.gif檔案,并可以利用圖檔檢視工具檢視. 

    fclose(file); 

本文轉自jetyi51CTO部落格,原文連結: http://blog.51cto.com/jetyi/890578,如需轉載請自行聯系原作者