HTTP Client

<span style="font-family: Arial, Helvetica, sans-serif;">#pragma once</span>
#include "stdio.h"  
#include "afxwin.h"
#include "afxinet.h"
#include "WinSock2.h"  
#include "iostream"  
using namespace std;  
#pragma comment(lib,"ws2_32.lib") 

class CUpload
{
public:
	CUpload(void);
	~CUpload(void);
private:
	long l_file_len;  
	/////编码转换/////////////////////////////////////////////////////////////
	char	* m_lpUTF8;			//UTF8编码缓存指针
	char	* m_lpMultiByte;	//Multil多字节编码指针
	wchar_t	* m_wpWideChar;		//Widechar编码缓存指针
	int		m_nUTF8Len;	
	int		m_nMultiByteLen;
	int		m_nWideCharLen;
public:
	bool Send_File(LPCTSTR lpszServer,LPCTSTR lpszAddr,int Server_Port,LPCTSTR File_Name);
	bool UploadFile(LPCTSTR lpszServer,LPCTSTR lpszAddr,LPCTSTR fileUrl,int Server_Port);
	bool Read_FileInfo(char **buffer,LPCSTR file);
	CHttpConnection* m_pConnection;
	CString MakeRequestHeaders(CString& strBoundary);
	CString MakePreFileData(CString& strBoundary, CString& strFileName, int iRecordID);
	CString MakePostFileData(CString& strBoundary);
	void WideCharToUTF8(LPCWSTR wpWideData, int WideLen);
};


//.cpp
#include "StdAfx.h"
#include "Upload.h"
#include <iostream>
#include <io.h>
#include <string>
using namespace std;
CUpload::CUpload(void)
{
	m_lpUTF8=NULL;
}
CUpload::~CUpload(void)
{
}

bool CUpload::Send_File(LPCTSTR lpszServer,LPCTSTR lpszAddr,int Server_Port,LPCTSTR File_Name)
{
	WORD wVersionRequested=MAKEWORD(2,2);  
	WSADATA wsaData;  
	if(WSAStartup(wVersionRequested,&wsaData))  
	{  
		return false;
	}  
	if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wHighVersion)!=2)  
	{  
		return false;
	}  
	UploadFile(lpszServer,lpszAddr,File_Name,Server_Port);  
	
}

//获取文件内容  
bool CUpload::Read_FileInfo(char **buffer,LPCSTR file)     
{     
  FILE *fp = fopen(file, "rb");   
  if(fp==NULL)  
  {  
	  return false;  
  }  
  fseek(fp, 0, SEEK_END);     
  l_file_len = ftell(fp);     
  rewind(fp);     
  *buffer = new char[l_file_len + 1];     
  memset(*buffer, 0, l_file_len + 1);      
  fseek(fp, 0, SEEK_SET);  
  fread(*buffer, sizeof(char), l_file_len, fp);  
  fclose(fp);    
  return true;  
}  
/*string*/ CString CUpload::MakeRequestHeaders(CString &strBoundary)//包头
{
	CString strFormat;
	CString strData;
	strFormat = _T("Content-Type:multipart/form-data;boundary=%s\r\n");//二进制文件传送Content-Type类型为: multipart/form-data
	string data_0="Content-Type:multipart/form-data;boundary=-----------------------------7b4a6d158c9";
	string data_1="\r\n";
	strData.Format(strFormat, strBoundary);
 	return strData;
	/*string data_info=data_0+data_1;
	return data_info;*/
}

/*string*/ CString CUpload::MakePreFileData(CString &strBoundary, CString &strFileName, int iRecordID)
{
	/**/////////////////////////////////////////////////////////////////////////////////
	//Content-Type:
	//JPG image/pjpeg
	//PNG image/x-png
	//BMP image/bmp
	//TIF image/tiff
	//GIF image/gif
	CString strFormat;
	CString strData;
	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"para1\"");//传给网络上的参数,根据网站抓包查看到底是需要哪些
	strFormat += _T("\r\n\r\n");
	strFormat += _T("my name is xiaoxiong");
	strFormat += _T("\r\n");

	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"para2\"");
	strFormat += _T("\r\n\r\n");
	strFormat += _T("sdfasd");//国软件研究所
	strFormat += _T("\r\n");

	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"trackdata\"; filename=\"%s\"");//文件地址信息
	strFormat += _T("\r\n");
	strFormat += _T("Content-Type: image/pjpeg");

	strFormat += _T("\r\n\r\n");
	strData.Format(strFormat,  strBoundary, strBoundary, strBoundary, strFileName);//
	int szie=strData.GetLength();
	return strData;

	
}

CString CUpload::MakePostFileData(CString &strBoundary)//发送请求包
{
	CString strFormat;
	CString strData;

	strFormat = _T("\r\n");	
	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"submitted\"");
	strFormat += _T("\r\n\r\n");
	strFormat += _T("hello");
	strFormat += _T("\r\n");
	strFormat += _T("--%s--");
	strFormat += _T("\r\n");
	strData.Format(strFormat, strBoundary, strBoundary);
	return strData;
}

//文件上传  
bool CUpload::UploadFile(LPCTSTR lpszServer,LPCTSTR lpszAddr,LPCTSTR fileUrl,int Server_Port)     
{  
	CString _mFilePath;
	_mFilePath = fileUrl;//要传的本地文件地址
	int startp = _mFilePath.ReverseFind('\\');
	int namelen = _mFilePath.GetLength()-startp-1;
	CString pcmname = _mFilePath;//.Mid(startp+1,namelen);
	CString defServerName =lpszServer;//服务器名
	CString defObjectName =lpszAddr;//保存的地址
	// USES_CONVERSION;
	CInternetSession Session;
	CHttpConnection *pHttpConnection = NULL;
	INTERNET_PORT   nPort = Server_Port/*8076*/;
	CFile fTrack;
	CHttpFile* pHTTP;
	CString strHTTPBoundary;
	CString strPreFileData;
	CString strPostFileData;
	DWORD dwTotalRequestLength;
	DWORD dwChunkLength;
	DWORD dwReadLength;
	DWORD dwResponseLength;
	TCHAR szError[MAX_PATH];
	void* pBuffer;
	LPSTR szResponse;
	CString strResponse;
	bool bSuccess = true;

	CString strDebugMessage;

	if (FALSE == fTrack.Open(_mFilePath, CFile::modeRead | CFile::shareDenyWrite))//读出文件 
	{
		return FALSE;
	}
 
	int iRecordID = 1;
	strHTTPBoundary = _T("---------------------------7b4a6d158c9");//定义边界值
	strPreFileData = MakePreFileData(strHTTPBoundary, pcmname, iRecordID);
	strPostFileData = MakePostFileData(strHTTPBoundary);
	int size_file= fTrack.GetLength();
	int PostFileDta_Size=strPostFileData.GetLength() ;
	int PreFileData= strPreFileData.GetLength();
	dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + fTrack.GetLength();//计算整个包的总长度
	dwChunkLength = 64 * 1024;
	pBuffer = malloc(dwChunkLength);
	if (NULL == pBuffer)
	{
		return FALSE;
	}
	try
	{
		pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
		pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
		CString str=MakeRequestHeaders(strHTTPBoundary);
		pHTTP->AddRequestHeaders(str);//发送包头请求
		pHTTP->SendRequestEx(dwTotalRequestLength/*, HSR_SYNC | HSR_INITIATE*/);
USES_CONVERSION;
#ifdef _UNICODE
       // WideCharToUTF8((LPCWSTR)(LPCTSTR)strPreFileData,strPreFileData.GetLength());
		pHTTP->Write(W2A(strPreFileData), strPreFileData.GetLength());
		//pHTTP->Write(m_lpUTF8,m_nUTF8Len);
#else
		pHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());//写入服务器所需信息
#endif
	   dwReadLength = -1;
	   size_t length=-1;
	   char *file_info;
	   char *info=new char[dwChunkLength];
	   while (0 != dwReadLength)
	   {
		   strDebugMessage.Format(_T("%u / %u\n"), fTrack.GetPosition(), fTrack.GetLength());
		   TRACE(strDebugMessage);
		   dwReadLength = fTrack.Read(pBuffer, dwChunkLength);//文件内容
		   if (0!=dwReadLength)
			{
				pHTTP->Write(pBuffer,dwReadLength);//写入服务器本地文件,用二进制进行传送
			}
	 	}
#ifdef _UNICODE
		 pHTTP->Write(W2A(strPostFileData.GetBuffer()), strPostFileData.GetLength());
#else
		pHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endif
		pHTTP->EndRequest(HSR_SYNC);
		dwResponseLength = pHTTP->GetLength();
		while (0 != dwResponseLength)
		{
			szResponse = (LPSTR)malloc(dwResponseLength + 1);
			szResponse[dwResponseLength] = '\0';
			pHTTP->Read(szResponse, dwResponseLength);
			strResponse += szResponse;
			free(szResponse);
			dwResponseLength = pHTTP->GetLength();
		}
	} 
	
	catch (CException* e)
	{
		e->GetErrorMessage(szError, MAX_PATH);
		e->Delete();
		bSuccess = false;
	}

	pHTTP->Close();
	delete pHTTP;

 	fTrack.Close();
	 
	if (NULL != pBuffer)
	{
		free((void*)pBuffer);
	}
	return bSuccess;
	///////////////////////////////////////////
}  
 
  
//将宽字符转为UTF-8
void CUpload::WideCharToUTF8(LPCWSTR wpWideData, int WideLen)
{
	//如果原先的数据没有删除
	if (m_lpUTF8)
	{
		delete [] m_lpUTF8;
		m_lpUTF8 = NULL;
	}
	m_nUTF8Len = WideCharToMultiByte(CP_UTF8,0,wpWideData,WideLen,NULL,0,NULL,NULL);
	m_lpUTF8 = new char[m_nUTF8Len + 1];
	m_lpUTF8[m_nUTF8Len] = 0;
	WideCharToMultiByte(CP_UTF8,0,wpWideData,WideLen,m_lpUTF8,m_nUTF8Len,NULL,NULL);

}
<pre name="code" class="cpp">//例如上传test.zip到指定的网址
	str_ServerUrl="www.test.com";
	str_ServerAddr="/Upload.aspx";
	Server_Port=8076;
	zip_name=L"test.zip";
 	m_upload.Send_File(str_ServerUrl,str_ServerAddr,Server_Port,zip_name);


 

你可能感兴趣的:(http)