• 使用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;
    }
  • 相关阅读:
    C#递归拷贝文件夹下文件以及文件夹
    C# 获取文件名、目录、后缀、无后缀文件名、扩展名
    C#递归得到特定文件夹下问件
    Are you seeing high number of busyio or busyworker threads in the timeout exception?
    减少查询中的资源使用
    SQL性能优化前期准备-清除缓存、开启IO统计
    Sql server 存储过程批量插入若干数据。
    python读取excel中单元格的内容返回的5种类型
    Python读取excel数据类型处理
    【转】 如何导入excel数据到数据库,并解决导入时间格式问题
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4135775.html
Copyright © 2020-2023  润新知