利用MFC Internet类请求图片数据

  1. 云栖社区>
  2. 博客>
  3. 正文

利用MFC Internet类请求图片数据

技术小甜 2017-11-14 17:49:00 浏览425
展开阅读全文

 


  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.     // 看到它包含image/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, image/jpeg, application/xaml+xml, image/gif, image/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); 

 







本文转自jetyi51CTO博客,原文链接: http://blog.51cto.com/jetyi/890578,如需转载请自行联系原作者









网友评论

登录后评论
0/500
评论
技术小甜
+ 关注