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,如需轉載請自行聯系原作者