Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356912
  • 博文数量: 132
  • 博客积分: 3066
  • 博客等级: 中校
  • 技术积分: 781
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-14 16:19
文章分类

全部博文(132)

文章存档

2012年(1)

2010年(50)

2009年(81)

我的朋友

分类: C/C++

2009-05-31 19:31:53

使用MFC提供的Http类下载和上传文件 
1 、下载文件
Download(
const  CString &  strFileURLInServer,  // 待下载文件的URL
const  CString  &  strFileLocalFullPath) // 存放到本地的路径
{
 ASSERT(strFileURLInServer 
!=   "" );
 ASSERT(strFileLocalFullPath 
!=   "" );
 CInternetSession session;
 CHttpConnection
*  pHttpConnection  =  NULL;
 CHttpFile
*  pHttpFile  =  NULL;
 CString strServer, strObject;
 INTERNET_PORT wPort;

 DWORD dwType;
 
const   int  nTimeOut  =   2000 ;
 session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); 
// 重试之间的等待延时
 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES,  1 );    // 重试次数
  char *  pszBuffer  =  NULL;  

 
try
 
{
  AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort);
  pHttpConnection 
=  session.GetHttpConnection(strServer, wPort);
  pHttpFile 
=  pHttpConnection -> OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
  
if (pHttpFile -> SendRequest()  ==  FALSE)
   
return   false ;
  DWORD dwStateCode;

  pHttpFile
-> QueryInfoStatusCode(dwStateCode);
  
if (dwStateCode  ==  HTTP_STATUS_OK)
  
{
    HANDLE hFile 
=  CreateFile(strFileLocalFullPath, GENERIC_WRITE,
         FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
         NULL);  
// 创建本地文件
    if (hFile  ==  INVALID_HANDLE_VALUE)
   
{
    pHttpFile
-> Close();
    pHttpConnection
-> Close();
    session.Close();
    
return   false ;
   }

 
   
char  szInfoBuffer[ 1000 ];   // 返回消息
   DWORD dwFileSize  =   0 ;    // 文件长度
   DWORD dwInfoBufferSize  =   sizeof (szInfoBuffer);
   BOOL bResult 
=  FALSE;
   bResult 
=  pHttpFile -> QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
           (
void * )szInfoBuffer, & dwInfoBufferSize,NULL);

   dwFileSize 
=  atoi(szInfoBuffer);
   
const   int  BUFFER_LENGTH  =   1024   *   10 ;
   pszBuffer 
=   new   char [BUFFER_LENGTH];   // 读取文件的缓冲
   DWORD dwWrite, dwTotalWrite;
   dwWrite 
=  dwTotalWrite  =   0 ;
   UINT nRead 
=  pHttpFile -> Read(pszBuffer, BUFFER_LENGTH);  // 读取服务器上数据

   
while (nRead  >   0 )
   
{
    WriteFile(hFile, pszBuffer, nRead, 
& dwWrite, NULL);   // 写到本地文件
    dwTotalWrite  +=  dwWrite;
    nRead 
=  pHttpFile -> Read(pszBuffer, BUFFER_LENGTH);
   }


   delete[]pszBuffer;
   pszBuffer 
=  NULL;
   CloseHandle(hFile);
  }

  
else
  
{
   delete[]pszBuffer;
   pszBuffer 
=  NULL;
   
if (pHttpFile  !=  NULL)
   
{
    pHttpFile
-> Close();
    delete pHttpFile;
    pHttpFile 
=  NULL;
   }

   
if (pHttpConnection  !=  NULL)
   
{
    pHttpConnection
-> Close();
    delete pHttpConnection;
    pHttpConnection 
=  NULL;
   }

   session.Close();
    
return   false ;
  }

 }

 
catch ( )
 
{
  delete[]pszBuffer;
  pszBuffer 
=  NULL;
  
if (pHttpFile  !=  NULL)
  
{
   pHttpFile
-> Close();
   delete pHttpFile;
   pHttpFile 
=  NULL;
  }

  
if (pHttpConnection  !=  NULL)
  
{
   pHttpConnection
-> Close();
   delete pHttpConnection;
   pHttpConnection 
=  NULL;
  }

  session.Close();
  
return   false ;
 }


 
if (pHttpFile  !=  NULL)
  pHttpFile
-> Close();
 
if (pHttpConnection  !=  NULL)
  pHttpConnection
-> Close();
 session.Close();
 
return   true ;
}


2 、上传文件
UploadFile(LPCTSTR strURL, 
// 负责接收上传操作的页面的URL
LPCTSTR strLocalFileName)   // 待上传的本地文件路径
{
 ASSERT(strURL 
!=  NULL  &&  strLocalFileName  !=  NULL);

 BOOL bResult 
=  FALSE;
 DWORD dwType 
=   0 ;
 CString strServer;
 CString strObject;
 INTERNET_PORT wPort 
=   0 ;
 DWORD dwFileLength 
=   0 ;
 
char   *  pFileBuff  =  NULL;

 CHttpConnection 
*  pHC  =  NULL;
 CHttpFile 
*  pHF  =  NULL;
 CInternetSession cis;

 bResult 
=   AfxParseURL(strURL, dwType, strServer, strObject, wPort);
 
if ( ! bResult)
  
return  FALSE;
 CFile file;
 
try
 
{
  
if ( ! file.Open(strLocalFileName, CFile::shareDenyNone  |  CFile::modeRead))
   
return  FALSE;
  dwFileLength 
=  file.GetLength();
  
if (dwFileLength  <=   0 )
   
return  FALSE;
  pFileBuff 
=   new   char [dwFileLength];
  memset(pFileBuff, 
0 sizeof ( char *  dwFileLength);
  file.Read(pFileBuff, dwFileLength);

  
const   int  nTimeOut  =   5000 ;
  cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); 
// 联接超时设置
  cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES,  1 );   // 重试1次
  pHC  =  cis.GetHttpConnection(strServer, wPort);   // 取得一个Http联接

  pHF 
=  pHC -> OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
  
if ( ! pHF -> SendRequest(NULL,  0 , pFileBuff, dwFileLength))
  
{
   delete[]pFileBuff;
   pFileBuff 
=  NULL;
   pHF
-> Close();
   pHC
-> Close();
   cis.Close();
   
return  FALSE;
  }

  DWORD dwStateCode 
=   0 ;
  pHF
-> QueryInfoStatusCode(dwStateCode);

  
if (dwStateCode  ==  HTTP_STATUS_OK)
   bResult 
=  TRUE;
 }


 
catch (CInternetException  *  pEx)
 
{
  
char  sz[ 256 =   "" ;
  pEx
-> GetErrorMessage(sz,  25 );
  CString str;
  str.Format(
" InternetException occur!\r\n%s " , sz);
  AfxMessageBox(str);
 }

 
catch (CFileException &  fe)
 
{
  CString str;
  str.Format(
" FileException occur!\r\n%d " , fe.m_lOsError);
  AfxMessageBox(str);
 }

 
catch ( )
 
{
  DWORD dwError 
=  GetLastError();
  CString str;
  str.Format(
" Unknow Exception occur!\r\n%d " , dwError);
  AfxMessageBox(str);
 }


 delete[]pFileBuff;
 pFileBuff 
=  NULL;
 file.Close();
 pHF
-> Close();
 pHC
-> Close();
 cis.Close();
 
return

阅读(1274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~