CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

怎么用CHttpConnection,CInternetSession,CHttpFile类做HTTP Server下载?

楼主hucaiyu()2005-08-17 15:16:09 在 VC/MFC / 网络编程 提问

怎么用CHttpConnection,CInternetSession,CHttpFile类做HTTP   Server下载?  
  我的问题  
  怎样利用CHttpFile来下载HTTP的文件?  
  请你给出步骤即可。谢谢各位了。 问题点数:20、回复次数:9Top

1 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-08-17 15:27:43 得分 10

//==========>   初始化回话  
  HINTERNET   hSession=::InternetOpen("Http",  
  PRE_CONFIG_INTERNET_ACCESS,  
  "",  
  INTERNET_INVALID_PORT_NUMBER,  
  0);  
   
  if(hSession==NULL){  
  AfxMessageBox("Internet   session   initalization   failed!");  
  return   1;  
  }  
   
  //==========>   创建链接  
  HINTERNET   hConnect=::InternetConnect(hSession,  
  pDlg->m_strServer,  
  INTERNET_INVALID_PORT_NUMBER,  
  "",  
  "",  
  INTERNET_SERVICE_HTTP,  
  0,  
  0);  
   
  if(hConnect==NULL){  
  AfxMessageBox("Internet   connect   initialization   failed!");  
  VERIFY(::InternetCloseHandle(hSession));  
  return   1;  
  }  
   
  //==========>   打开请求链接  
  HINTERNET   hHttpFile=::HttpOpenRequest(hConnect,  
  "GET",  
  pDlg->m_strPath,  
  HTTP_VERSION,  
  NULL,  
  0,  
  INTERNET_FLAG_DONT_CACHE,  
  0);  
   
  if(hHttpFile==NULL){  
  AfxMessageBox("Http   request   failed!");  
  VERIFY(::InternetCloseHandle(hConnect));  
  VERIFY(::InternetCloseHandle(hSession));  
  return   1;  
  }  
   
  //==========>   发送请求  
  BOOL   bSendRequest=::HttpSendRequest(hHttpFile,  
  NULL,  
  0,  
  0,  
  0);  
   
  if(bSendRequest){  
  char   achQueryBuf[16];  
  DWORD   dwFileSize;  
  DWORD   dwQueryBufLen=sizeof(achQueryBuf);  
   
  BOOL   bQuery=::HttpQueryInfo(hHttpFile,  
  HTTP_QUERY_CONTENT_LENGTH,  
  achQueryBuf,  
  &dwQueryBufLen,  
  NULL);  
   
  if(bQuery){  
  dwFileSize=(DWORD)atol(achQueryBuf);  
  }  
  else{  
  dwFileSize=10*1024;  
  }  
   
  char*   lpszBuf=new   char[dwFileSize+1];  
  DWORD   dwBytesRead;  
   
  //==========>   读取文件  
  BOOL   bRead=::InternetReadFile(hHttpFile,  
  lpszBuf,  
  dwFileSize+1,  
  &dwBytesRead);  
  Top

2 楼hucaiyu()回复于 2005-08-17 15:39:32 得分 0

先谢你了,我试试看。全用API。Top

3 楼i_noname(晚九朝五)回复于 2005-08-17 15:45:57 得分 10

char   szHtm[1024];     //缓存  
  szHtm[1023]   =   '\0';  
  CString   strHtm   =   "";  
  CInternetSession   sess;  
  CHttpFile*   pF;  
   
  TRY  
  {  
  pF   =   (CHttpFile   *)sess.OpenURL(strUrl);  
   
  while   (pF->Read(szHtm,   1023)   !=   0)  
  {  
  strHtm   +=   szHtm;  
  }  
  }  
  CATCH(CInternetException,   e)  
  {  
  MessageBox("连接出错!");  
  return;  
  }  
  END_CATCH  
   
  pF->Close();  
  if   (pF   !=   NULL)  
  {  
  delete   pF;  
  }  
  sess.Close();  
  Top

4 楼hucaiyu()回复于 2005-08-19 13:55:54 得分 0

TO:horisly(SUN   YAT-SEN   UNIVERSITY   (逸仙先生))    
   
  现在程序已经调式通过,但问题有以下几点:  
  1。只能完整下载html类型的文件,不能完整下载其他类型的文件;  
  2。当新建立本地文件后,一般要写2次才能成功。如果文件已经存在,经替换后,  
      可以一次写入成功;  
  3。 //==========>   打开请求链接  
  HINTERNET   hHttpFile=::HttpOpenRequest(  
                                      hConnect,  
  "GET",  
  pDlg->m_strPath,  
  0,//我想换成http/2.0,怎么做??  
  URL,  
  (TCHAR)"text/*",//lplpszAcceptTypes,怎样接受其他类型的文件??  
  INTERNET_FLAG_DONT_CACHE,  
  0);  
   
  谢谢了Top

5 楼i_noname(晚九朝五)回复于 2005-08-19 14:01:58 得分 0

从连接中得到的都是二进制数据没有类型的区别,你读http就保存成http文件,读到jpg就存成jpg文件,这是写文件时的区别。Top

6 楼hucaiyu()回复于 2005-08-19 14:12:55 得分 0

lplpszAcceptTypes    
  [in]   Long   pointer   to   a   null-terminated   array   of   string   pointers   indicating   content   types   accepted   by   the   client.   If   this   parameter   is   NULL,   no   types   are   accepted   by   the   client.   Servers   interpret   a   lack   of   accept   types   to   indicate   that   the   client   accepts   only   documents   of   type   "text/*"   (that   is,   only   text   documents,   and   not   pictures   or   other   binary   files).    
  ////////////////////////////////  
  Servers   interpret   a   lack   of   accept   types   to   indicate   that   the   client   accepts   only   documents   of   type   "text/*"  
  那这句话该怎样正确翻译呢?没看明白Top

7 楼hucaiyu()回复于 2005-08-19 14:33:33 得分 0

TO:i_noname(晚九朝五)    
  ////////////////////////////  
  while   (pF->Read(szHtm,   1023)   !=   0)  
  {  
  strHtm   +=   szHtm;  
  }  
  如果我要下载的文件有10MB,那strHtm的长度也不成了10MB??Top

8 楼i_noname(晚九朝五)回复于 2005-08-20 15:28:51 得分 0

回楼上,你不一定要用strHtm来保存啊,可以直接写在文件中的。  
  while   (pF->Read(szHtm,   1023)   !=   0)  
  {  
        File.Write(szHtm,1024);  
  }  
  Top

9 楼hucaiyu()回复于 2005-08-22 17:51:24 得分 0

我下载是直接写到文件里面了。这个方法很简单很实用。  
  谢谢楼上的兄弟。。。Top

相关问题

  • 我用CHttpFile下载文件时候的错误。
  • 使用 CHttpConnection 下载二进制文件,为什么总出现 HTTP 406 Error
  • 下载?
  • 下载
  • 下载???
  • 为什么CInternetSession下载的网页内容和浏览器看到的内容不同
  • 下载图书
  • 哪有KILIX下载,
  • 下载地址
  • visual studio.net下载?

关键词

  • 文件
  • 下载
  • internet
  • client
  • null
  • szhtm
  • chttpfile
  • strhtm
  • hhttpfile
  • cinternetsession

得分解答快速导航

  • 帖主:hucaiyu
  • horisly
  • i_noname

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo