[转]使用MFC提供的Http类下载和上传文件

使用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, 
0sizeof(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 bResult;
}

posted @ 2008-07-29 02:44  吴碧宇  阅读(3910)  评论(3编辑  收藏  举报