您的位置:首页 > 理论基础 > 计算机网络

VC实现HTTP上传和下载

2014-01-06 17:02 483 查看
上传

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 bResult;

}

下载

bool 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;

bool bReturn = false;

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);

bReturn = true;

}

}

catch(CInternetException* e)

{

TCHAR tszErrString[256];

e->GetErrorMessage(tszErrString, ArraySize(tszErrString));

TRACE(_T("Download XSL error! URL: %s,Error: %s"), strFileURLInServer, tszErrString);

e->Delete();

}

catch(...)

{

}

if(pszBuffer != NULL)

{

delete[]pszBuffer;

}

if(pHttpFile != NULL)

{

pHttpFile->Close();

delete pHttpFile;

}

if(pHttpConnection != NULL)

{

pHttpConnection->Close();

delete pHttpConnection;

}

session.Close();

return bReturn;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: