zoukankan      html  css  js  c++  java
  • 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!
    %s", sz);
      AfxMessageBox(str);
     }
     catch(CFileException& fe)
     {
      CString str;
      str.Format("FileException occur!
    %d", fe.m_lOsError);
      AfxMessageBox(str);
     }
     catch(...)
     {
      DWORD dwError = GetLastError();
      CString str;
      str.Format("Unknow Exception occur!
    %d", dwError);
      AfxMessageBox(str);
     }
    
     delete[]pFileBuff;
     pFileBuff = NULL;
     file.Close();
     pHF->Close();
     pHC->Close();
     cis.Close();
     return bResult;
    }
  • 相关阅读:
    python 基础笔记十
    python 基础笔记十一
    python 基础笔记九-集合
    python 基础笔记八-time模块
    python 基础笔记七-OS模块
    python 基础笔记六-函数
    Python 基础笔记四
    4-5 元祖
    4-4 修改文件
    4-3 高效读取文件 --待完成
  • 原文地址:https://www.cnblogs.com/wangchenggen/p/3926329.html
Copyright © 2011-2022 走看看