VC实现Http Put方法

http://blog.csdn.net/mrxyz098/article/details/27991335

该函数可用于向服务器上传文件。服务器端可以有专门的接收机制,也可以没有。

  1. #include <Wininet.h>  
  2.                      
  3. #pragma comment(lib, "Wininet.lib")  
  4. BOOL HttpRequestPut(LPCTSTR pHomeUrl, LPCTSTR pPageUrl, LONG nPort,  
  5.     LPCTSTR pFile, CString *psRes, PBOOL pbExit)  
  6. {  
  7.     LPINTERNET_BUFFERS pBufferIn = new INTERNET_BUFFERS;  
  8.     ZeroMemory(pBufferIn, sizeof(INTERNET_BUFFERS));  
  9.     LPBYTE pBuf = new BYTE[1024];  
  10.     HINTERNET hInternet = NULL;  
  11.     HINTERNET hSession = NULL;  
  12.     HINTERNET hRequest = NULL;  
  13.     DWORD dwBytesRead;  
  14.     DWORD dwBytesWritten;  
  15.     HANDLE hFile = INVALID_HANDLE_VALUE;  
  16.     CString sFormat(_T("Connection: Keep-Alive\r\n"));  
  17.     sFormat += _T("Content-Type: application/octet-stream\r\n");  
  18.     sFormat += _T("Content-Length: %u\r\n");  
  19.     sFormat += _T("User-Agent:Test\r\n");  
  20.     sFormat += _T("Host: %s:%u\r\n");  
  21.     sFormat += _T("Accept: *.*,*/*\r\n");  
  22.     sFormat += _T("\r\n");  
  23.     CString sHeader(_T(""));  
  24.     CString sRes(_T(""));  
  25.                      
  26.     do  
  27.     {  
  28.         hInternet = InternetOpen(_T("Mozilla/4.0 (compatible; Indy Library)"),    
  29.       INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);   
  30.         if( NULL == hInternet )  
  31.         {   
  32.             sRes.Format(_T("Open link error. ErrCode=[%u]"), GetLastError());  
  33.             break;  
  34.         }  
  35.                      
  36.         hSession = InternetConnect(hInternet, pHomeUrl, (INTERNET_PORT)nPort,  
  37.             NULL, NULL,INTERNET_SERVICE_HTTP, INTERNET_FLAG_NO_CACHE_WRITE, 0);  
  38.         hRequest = HttpOpenRequest(hSession, _T("PUT"), pPageUrl,  
  39.             NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);  
  40.         if( FALSE == hRequest )  
  41.         {  
  42.             sRes.Format(_T("Open request handle error. ErrCode=[%u]"),  
  43.                 GetLastError());  
  44.             break;  
  45.         }  
  46.                      
  47.         hFile = CreateFile(pFile, GENERIC_READ, FILE_SHARE_READ, NULL,  
  48.              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  49.         if( hFile == INVALID_HANDLE_VALUE )  
  50.         {  
  51.             sRes.Format(_T("Open File error. ErrCode=[%u] File=[%s]"),  
  52.                 GetLastError(), pFile);  
  53.             break;  
  54.         }  
  55.                      
  56.         pBufferIn->dwStructSize = sizeof(INTERNET_BUFFERS);  
  57.         pBufferIn->dwBufferTotal = GetFileSize(hFile, NULL);  
  58.         sHeader.Format(sFormat, pBufferIn->dwBufferTotal, pHomeUrl, nPort);  
  59.         pBufferIn->lpcszHeader = sHeader;  
  60.         pBufferIn->dwHeadersLength = sHeader.GetLength();  
  61.                      
  62.         if( FALSE ==  
  63.             HttpSendRequestEx(hRequest, pBufferIn, NULL, HSR_INITIATE, 0) )  
  64.         {  
  65.             sRes.Format(_T("Send request error."));  
  66.             break;  
  67.         }  
  68.                      
  69.         DWORD dwSendSize = 0;  
  70.         while( dwSendSize < pBufferIn->dwBufferTotal )  
  71.         {  
  72.             if( (NULL!=pbExit) && (FALSE!=(*pbExit)) )  
  73.             {  
  74.                 sRes.Format(_T("Stop upload because receive exit cmd."));  
  75.                 break;  
  76.             }  
  77.                      
  78.             if( FALSE == ReadFile( hFile, pBuf, 1024, &dwBytesRead, NULL) )  
  79.             {  
  80.                 sRes.Format(_T("Read File error. ErrCode=[%u] File=[%s]"),  
  81.                     GetLastError(), pFile);  
  82.                 break;  
  83.             }  
  84.                      
  85.             if( FALSE == InternetWriteFile(hRequest, pBuf, dwBytesRead,  
  86.                   &dwBytesWritten) )  
  87.             {// ERROR_INTERNET_CONNECTION_ABORTED  
  88.                 sRes.Format(_T("Upload File error. ErrCode=[%u] File=[%s]"),              
  89.             GetLastError(), pFile);  
  90.                 break;  
  91.             }  
  92.                      
  93.             dwSendSize += dwBytesWritten;  
  94.         }  
  95.                      
  96.         if( FALSE == HttpEndRequest(hRequest, NULL, 0, 0) )  
  97.         {  
  98.             sRes.Format(_T("End request error. ErrCode=[%u] File=[%s]"),  
  99.                 GetLastError(), pFile);  
  100.         }  
  101.        
  102.     }while(FALSE);  
  103.                      
  104.     if( hFile != INVALID_HANDLE_VALUE )  
  105.     {  
  106.         CloseHandle(hFile);  
  107.     }  
  108.     if( hRequest )  
  109.     {  
  110.         InternetCloseHandle(hRequest);  
  111.     }  
  112.     if( hSession )  
  113.     {  
  114.         InternetCloseHandle(hSession);  
  115.     }  
  116.     if( hInternet )  
  117.     {  
  118.         InternetCloseHandle(hInternet);  
  119.     }  
  120.                      
  121.     delete []pBuf;  
  122.     delete pBufferIn;  
  123.                      
  124.     if( NULL != psRes )  
  125.     {  
  126.         *psRes = sRes;  
  127.     }  
  128.                      
  129.     return sRes.IsEmpty();  
  130. }  

你可能感兴趣的:(VC实现Http Put方法)