HOWTO: 使用 InternetReadFile 获取文件

HOWTO: 使用 InternetReadFile 获取文件

文章编号:149413
最后修改:2002年5月17日
修订:1.0

概要

使用 WinInet API,InternetReadFile 返回下面的缓冲区:
<body> <h1> 未找到 HTTP / 1.0 406 否可接受的对象 </h1> </body>

更多信息

这是一个 HTTP 服务器特定的错误。 Microsoft IIS 可能会返回此错误存在时没有正确的 Accept 标头 ("接受: * / *") 在 HTTP 请求中。 可以使用下面的 API 添加这样的标头:
   InternetOpenUrl(),
   HttpSendRequest(),
   HttpAddRequestHeaders()
				
注意其他 HTTP 服务器可能或不可能在相同的方式中的行为。 下面的代码演示如何传输任何类型的文件使用 WinInet API:
   BOOL GetFile (HINTERNET IN hOpen, // Handle from InternetOpen()
                 CHAR *szUrl,        // Full URL
                 CHAR *szFileName)   // Local file name
   {
       DWORD dwSize;
       CHAR   szHead[] = "Accept: */*/r/n/r/n";
       VOID * szTemp[25];
       HINTERNET  hConnect;
      FILE * pFile;

       if ( !(hConnect = InternetOpenUrl ( hOpen, szUrl, szHead,
             lstrlen (szHead), INTERNET_FLAG_DONT_CACHE, 0)))
       {
         cerr << "Error !" << endl;
           return 0;
       }

       if  ( !(pFile = fopen (szFileName, "wb" ) ) )
      {
           cerr << "Error !" << endl;
          return FALSE;
      }
       do
       {
          // Keep coping in 25 bytes chunks, while file has any data left.
          // Note: bigger buffer will greatly improve performance.
          if (!InternetReadFile (hConnect, szTemp, 50,  &dwSize) )
          {
              fclose (pFile);
             cerr << "Error !" << endl;
            return FALSE;
          }
          if (!dwSize)
              break;  // Condition of dwSize=0 indicate EOF. Stop.
          else
             fwrite(szTemp, sizeof (char), dwSize , pFile);
       }   // do
      while (TRUE);
      fflush (pFile);
      fclose (pFile);
      return TRUE;
   }
的相同的任务可以使用 WinInet MFC 类完成下面的方式:
   #include <afx.h>
   #include <afxinet.h>

   BOOL  GetFile (CHAR *szUrl, CHAR *szFileName)
   {
   TCHAR sz[1024];
   CInternetSession session (_T("MyTest agent"), 1,
     INTERNET_OPEN_TYPE_DIRECT);
   CStdioFile* pFile = NULL;
   CHAR   szHead[] = "Accept: */*/r/n/r/n";
       DWORD nRead;
   CFile myFile;
   CFileException fileException;

   if ( !myFile.Open (szFileName, CFile::modeCreate | CFile::modeReadWrite,
      &fileException ) )
   {
   cerr << "Can't open file: " << szFileName
    << " error = " << fileException.m_cause  <<"/n";
   return FALSE;
   }

   try
   {
   pFile = session.OpenURL (szUrl, 1, INTERNET_FLAG_RELOAD
   |INTERNET_FLAG_TRANSFER_BINARY,
    szHead, -1L);

   }
   catch (CInternetException *pEx)
   {
   cerr <<"OpenUrl failed: "<< pEx-> m_dwError << endl;
   return FALSE;
   }

       do
   {
   nRead = pFile->Read(sz, 1023);
   if (nRead != 0)
   myFile.Write (sz, nRead);
   }
   while (nRead != 0);
   myFile.Close();
   pFile->Close();
   if (pFile != NULL)
   delete pFile;
   session.Close();
   return TRUE;
   }

这篇文章中的信息适用于:
Microsoft Internet Explorer 3.0
Microsoft Internet Information Server 3.0
Microsoft Windows NT 3.51 Service Pack 5
Microsoft Windows NT 4.0
Microsoft Windows NT 4.0 Service Pack 4
Microsoft Windows 95
Microsoft Windows Internet Services (WinInet)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值