天天看点

利用MFC Internet类请求图片数据

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