- 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)
- return;
- // 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);
- dwErr = ::GetLastError();
- // 请求到的数据长度,也就是baidu_sylogo1.gif的大小.
- 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,如需转载请自行联系原作者