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,如需转载请自行联系原作者