利用MFC Internet類請求圖片數據

 

  
  
  
  
  1. void GetGifFromInternet() 
  2.     CInternetSession interSess; 
  3.     CHttpConnection* pHttpConn = interSess.GetHttpConnection(_T("www.baidu.com"), // A line 
  4.         (INTERNET_PORT)INTERNET_DEFAULT_HTTP_PORT, NULL, NULL); 
  5.     if (NULL == pHttpConn) 
  6.         return
  7.  
  8.     // 這個函數的參數至關於設置HTTP頭,第二個參數指出所要請求的資源web子路徑,它這裏是請求圖片/img/baidu_sylogo1.gif,它的根路徑是www.baidu.com, 
  9.     // 也就是A line第一個參數www.baidu.com.最終,系統會造成所請求資源的全路徑:http://www.baidu.com/img/baidu_sylogo1.gif 
  10.     // 對於第3個參數,從msdn描述來看,彷佛是指出資源(baidu_sylogo1.gif)的路徑,不過它爲能夠爲NULL,彷佛沒有用,也就是說它不會影響資源 
  11.     // 全路徑的組合,不會影響C line的調用.不曉得怎麼回事???????. 
  12.     // 第5個參數ppstrAcceptTypes指出請求資源的類型,默認爲text/*,也就是文本,若是你請求的是圖片,那麼要包含圖片類型,例如img/gif等.能夠看出 
  13.     // 應該傳入LPCTSTR數組指針,可是很奇怪,數組的值怎麼樣,都會致使函數執行失敗,那麼要爲這個數組傳遞怎樣的值才能成功調用該函數呢? 
  14.     DWORD dwFlag = INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES; 
  15.     CHttpFile* phttpfile = pHttpConn->OpenRequest(_T("GET"), _T("/img/baidu_sylogo1.gif")); // B Line 
  16.     if (NULL == phttpfile) 
  17.         return
  18.  
  19.     // A line 和 B line會組合成完整的URL:http://www.baidu.com/img/baidu_sylogo1.gif 
  20.     // 且該函數會返回該URL.B行的第3個參數不會影響C調用返回值. 
  21.     // 也就是說,若是A line第1個參數和B line第2個參數設置不正確,則不可以組合成一個有效的URL,會致使 
  22.     // 下面對SendRequest函數調用錯誤. 
  23.     CString url = phttpfile->GetFileURL(); // C line 
  24.  
  25.     // A line,B line 都至關於添加了HTTP頭,然而程序可能會修改這個HTTP頭,D line的調用提供了一種修改HTTP頭的方法. 
  26.     // 能夠添加,修改,替代等.在這裏, D line的目的僅僅是修改了HTTP頭中Accept的的值,指出客戶端能夠接收的數據,能夠 
  27.     // 看到它包含p_w_picpath/gif,指出能夠接收gif文件.若是不指定這一項,OS默認只接受text/*,也就是文本數據. 
  28.     // 注意: HTTP頭有多項,OS默認設置了一些,因此程序能夠省略,有些項是能夠沒有的. 
  29.     // HTTP頭不是那麼容易寫的,在編程能夠在瀏覽器中請求某個資源,而後用抓包工具抓取到這個數據包,而後就能夠看到HTTP頭 
  30.     // 的,將該HTTP頭中的內容選擇必要的部分複製下來,在這裏組合成字符串便可. 
  31.     // 這個HTTP頭有些是可省略的,至於哪些能夠省略,這就須要先測試一下. 
  32.     LPCTSTR lpHeader =   
  33.     _T("GET /img1/baidu_sylogo1.gif /HTTP/1.1"// a1 
  34.     _T("Accept: application/x-ms-application, p_w_picpath/jpeg, application/xaml+xml, p_w_picpath/gif, p_w_picpath/pjpeg, application/x-ms-xbap, */*"
  35.     _T("Accept-Language: zh-CN"//a2 
  36.     _T("Host: www.baidu.com"//a3 
  37.     _T("User-Agent: MFCAppTest.exe"
  38.     _T("Connection: Keep-Alive")//a4 
  39.     _T("\r\n\r\n"); 
  40.     // 若是dwFlags==HTTP_ADDREQ_FLAG_ADD_IF_NEW,a1,a2,a3,a4也能夠省略. 
  41.     BOOL bRet = phttpfile->AddRequestHeaders(lpHeader);// D line 
  42.     DWORD dwErr = ::GetLastError(); 
  43.  
  44.     // 請求的資源路徑不能改變,它的值仍然應同 C Line調用時相同. 
  45.     url = phttpfile->GetFileURL(); // E line  
  46.  
  47.     bRet = phttpfile->SendRequest(); // F line 發送請求gif文件數據的請求. 
  48.  
  49.     CString ojb = phttpfile->GetObject(); // 獲取的資源名稱,這裏是baidu_sylogo1.gif 
  50.  
  51.     TCHAR buf[BUF_4096] = {0}; 
  52.     DWORD dwBytes = BUF_4096-1; 
  53.     DWORD dwIndex = 0; 
  54.     // HTTP_QUERY_CONTENT_TYPE 若是F line執行成功,這裏應該返回img/gif. 
  55.     bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, buf, &dwBytes, &dwIndex); 
  56.     dwErr = ::GetLastError(); 
  57.  
  58.     // 請求到的數據長度,也就是baidu_sylogo1.gif的大小. 
  59.     dwBytes = BUF_4096-1; 
  60.     dwIndex = 0;         
  61.     bRet = phttpfile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, buf, &dwBytes, &dwIndex); 
  62.     dwErr = ::GetLastError(); 
  63.  
  64.     // 請求到的數據長度,也就是baidu_sylogo1.gif的大小. 
  65.     int len = phttpfile->GetLength(); 
  66.  
  67.     // 讀取baidu_sylogo1.gif文件數據,而後以二進制形式保存下來. 
  68.     int nBytes = _tstoi(buf); 
  69.     dwBytes = phttpfile->Read(buf, nBytes); 
  70.     FILE* file = fopen("g:\\pic.gif""wb"); 
  71.     fwrite(buf, nBytes, 1, file); // 保存以後能夠看到pic.gif文件,並能夠利用圖片查看工具查看. 
  72.     fclose(file); 
相關文章
相關標籤/搜索