• [转]使用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;
    }

  • 相关阅读:
    Pig设计模式概要以及与SQL的设计模式的对比
    Pig设计模式概要以及与SQL的设计模式的对比
    ArcGIS API for Silverlight 学习笔记
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/wubiyu/p/1255186.html
Copyright © 2020-2023  润新知