VC http post 文件到服务器

2023-05-16

首先引入 #include "afxinet.h"

其次准备好HTTP POST服务器   

STDMETHODIMP CPostPDFToA4::t5PostPDFToA4(BSTR strFileName, BSTR strFileFullPath, BSTR* pstrMsg)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加实现代码

	USES_CONVERSION;
	// TODO: 在此添加实现代码

	CString strURL; //负责接收上传操作的页面的URL
	CString strLocalFileName;
	CString strName;
	DWORD dwFileNameLength;

	CString strPreFileData;
	CString strPostFileData;

	CString strHTTPBoundary;
	DWORD dwResponseLength;
	int iRecordID = 1;
	strHTTPBoundary = _T("---------------------------7b4a6d158c9");//定义边界值

	// 获取POST地址
	ReadXML();
	DWORD dwReadLength;
	strName = strFileName;//_T("Visual.C++技术内幕_第四版.pdf");
	strLocalFileName = strFileFullPath;//_T("C:\\Visual.C++技术内幕_第四版.pdf");
	strURL = m_strUrl;// _T("hte");//+ strLocalFileName;
	dwFileNameLength = sizeof(strName);
	//ASSERT(strURL != NULL && strLocalFileName != NULL);

	// 生成传送头数据
	strPreFileData = MakePreFileData(strHTTPBoundary, strName, iRecordID);
	// 生成传送数据
	strPostFileData = MakePostFileData(strHTTPBoundary);

	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;
	LPSTR szResponse;
	//bResult =  
	// 解析POST地址
	AfxParseURL(strURL, dwType, strServer, strObject, wPort);
	//if(!bResult)
	//	return ;

	CFile file;
	DWORD dwDataSize;
	try
	{
		if(!file.Open(strLocalFileName, CFile::shareDenyNone | CFile::modeRead))
			return S_FALSE;
		dwFileLength = file.GetLength();
		if(dwFileLength <= 0)
			return S_FALSE;
		//======================================================
		file.SeekToBegin();

		CByteArray array;
		array.SetSize(dwDataSize);

		VERIFY( dwDataSize == file.Read(array.GetData(), dwDataSize) );
		//file.Close();
		//==============================================================

		pFileBuff = new char[dwFileLength];
		memset(pFileBuff, 0, sizeof(char) * dwFileLength);

		const int nTimeOut = 10000;
		cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //联接超时设置
		cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);  //重试1次
		pHC = cis.GetHttpConnection(strServer, wPort);//,_T("admin"),_T("admin"));  //取得一个Http联接
		// 打开连接
		pHF = pHC->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
		/*pHF->AddRequestHeaders(strName,
		HTTP_ADDREQ_FLAG_ADD_IF_NEW,dwFileNameLength );*/
		DWORD dwTotalRequestLength;
		pHF->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));//发送包头请求

		dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + dwFileLength;//计算整个包的总长度
		// 发送文件数据流
		pHF->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);

#ifdef _UNICODE
		pHF->Write(W2A(strPreFileData), strPreFileData.GetLength());
#else
		pHF->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());//写入服务器所需信息
#endif

		dwReadLength = -1;
		while (0 != dwReadLength)
		{
			/*strDebugMessage.Format(_T("%u / %u\n"), fTrack.GetPosition(), fTrack.GetLength());
			TRACE(strDebugMessage);*/
			dwReadLength = file.Read(pFileBuff, dwFileLength);
			if (0 != dwReadLength)
			{
				pHF->Write(pFileBuff, dwReadLength);//写入服务器本地文件,用二进制进行传送
			}
		}

#ifdef _UNICODE

		pHF->Write(W2A(strPostFileData), strPostFileData.GetLength());
#else
		pHF->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endif
		pHF->EndRequest(HSR_SYNC);
		LPSTR szResponse;
		CString strResponse;
		dwResponseLength = pHF->GetLength();
		while (0 != dwResponseLength)
		{
			szResponse = (LPSTR)malloc(dwResponseLength + 1);
			szResponse[dwResponseLength] = '\0';
			pHF->Read(szResponse, dwResponseLength);
			strResponse += szResponse;
			free(szResponse);
			dwResponseLength = pHF->GetLength();
		}

		/*if(!pHF->SendRequest(NULL, 0, pFileBuff, dwFileLength))
		{
		delete[]pFileBuff;
		pFileBuff = NULL;
		pHF->Close();
		pHC->Close();
		cis.Close();
		return;
		}*/
		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 S_OK;
}

CString CPostPDFToA4::MakeRequestHeaders(CString &strBoundary)//包头
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CString strFormat;
	CString strData;

	strFormat = _T("Content-Type: multipart/form-data; boundary=%s\r\n");//二进制文件传送Content-Type类型为: multipart/form-data

	strData.Format(strFormat, strBoundary);
	return strData;
}

CString CPostPDFToA4::MakePreFileData(CString &strBoundary, CString &strFileName, int iRecordID)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	/**/
	//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=\"test1\"");//除了文件数据,还可以传送其它信息
	//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=\"test2\"");
	//strFormat += _T("\r\n\r\n");
	//strFormat += _T("哈哈");
	//strFormat += _T("\r\n");

	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"upfile\"; filename=\"%s\"");				
	strFormat += _T("\r\n");
	strFormat += _T("Content-Type: text/pdf;charset=utf-8");

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

	return strData;
}

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

	strFormat = _T("\r\n");	
	strFormat += _T("--%s");
	strFormat += _T("\r\n");
	strFormat += _T("Content-Disposition: form-data; name=\"upload\"");
	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 CPostPDFToA4::ReadXML()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	TCHAR buffer[MAX_PATH] = {0};
	::GetModuleFileName(NULL, buffer, MAX_PATH);
	CString strPath = buffer;
	int nIndex = strPath.ReverseFind(_T('\\'));
	strPath = strPath.Left(nIndex + 1);
	CString strConfigFile = strPath + _T("SendServer.xml");

	try{
		MSXML2::IXMLDOMDocumentPtr xdoc;
		xdoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
		if(xdoc == NULL)
		{
			AfxMessageBox(_T("创建XML文档对象失败"));
			return FALSE;
		}

		xdoc->load(_variant_t(strConfigFile));
		MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
		nodelist = xdoc->selectNodes(_T("HTTPPOST/服务"));

		MSXML2::IXMLDOMNodePtr subnode;
		long nodecount;
		nodelist->get_length(&nodecount);
		for(long i = 0; i < nodecount; i++)
		{
			subnode = nodelist->nextNode()->selectSingleNode((_bstr_t)_T("URL"));
			if(subnode != NULL)
			{
				_bstr_t str = subnode->Gettext();
				if(str.length() > 0)
					m_strUrl = (LPCTSTR)str;
			}
		}
	}
	catch(...)
	{
		AfxMessageBox(_T("读取SendServer.xml文件失败"));
		return FALSE;
	}

	return TRUE;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC http post 文件到服务器 的相关文章

随机推荐

  • RTK-Real Time kinematic实时动态

    目前 xff0c GNSSj接收机约99 的时间都用作RTK模式进行测量 xff0c 只有1 的时间用作静态测量做控制网等 所以 xff0c 大部分人都习惯把GNSS接收机喊成RTK了 不过除去GNSS接收机 xff0c 你知道RTK是什么
  • USB-PD3.0(Power Delivery)充电协议

    USB PD xff08 Power Delivery xff09 是基于USB Type C的一种电源供电标准 xff0c 最大供电功率可达100瓦 xff08 W xff09 xff1b 随着USB Type C的普及 xff0c 越来
  • Lua ---- LFS库的使用

    lfs attributes filepath aname 获取路径指定属性 lfs chdir path 改变当前工作目录 xff0c 成功返回true xff0c 失败返回nil加上错误信息 lfs currentdir 获取当前工作目
  • USB2.0实际传输速度

    USB2 0规范中传输速度是480 Mbps 即60 MB s 但是很多USB2 0设备在实际工作时的数据传输速度却与此相差甚远 xff0c 比如用PC用U盘拷个东西 xff0c 往往比60MB s慢很多 xff0c 这是为什么呢 xff1
  • Type-C协议-CC检测原理

    Type C协议简介 xff08 CC检测原理 xff09 1 简介 越来越多的手机开始采用Type C作为充电和通信端口 xff0c Type C连接器实物和PIN定义如下图 xff1a Type C连接器中有两个管脚CC1和CC2 xf
  • 基地址和偏移地址

    首先必须明白 cpu和内存的区别 cpu 中央处理器 内存是物理数据存放的地方 cpu不直接存放数据而是通过内存来存放数据 cpu和内存之间通过20条地址总线相连接 xff0c 地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具
  • RZ、NRZ、NRZ1、曼彻斯特编码

    1 RZ Return Zero Code 编码 也称为归零码 xff0c 特性就是在一个周期内 xff0c 用二进制传输数据位 xff0c 在数据位脉冲结束后 xff0c 需要维持一段时间的低电平 RZ编码又分为两种 xff1a 单极性归
  • LTE中RB和RE、REG、CCE的定义

    一 RB RE REG CCE定义 xff1a 1 RB Resource Block xff1a 频率上连续12个子载波 xff0c 时域上一个slot xff0c 称为1个RB xff0c 即1RB 61 12个子载波 RB 61 12
  • UART 波形

    先介绍一些概念 起始位 先发出一个逻辑 0 的信号 xff0c 表示传输数据的开始 校验位 xff1a 数据位加上这一位后 xff0c 使得 1 的位数应为偶数 偶校验 或奇数 奇校验 xff0c 以此来校验数据传送的正确性 就比如传输 A
  • UART中的硬件流控RTS与CTS

    在RS232中本来CTS 与RTS 有明确的意义 xff0c 但自从贺氏 HAYES 推出了聪明猫 SmartModem 后就有点混淆了 xff0c 不过现在这种意义为主流意义的 xff0c 各大芯片制造厂家对UART控制器的流控基本采用H
  • AC-DC电源

    电源是什么 xff1f 电源是将来自能量源 xff08 如供电网 xff09 的电流转换为负载 xff08 如电机或电子设备 xff09 用电所需的电压和电流值的电气设备 电源的目的是以适当的电压和电流为负载供电 因此电流必须以受控的方 式
  • VYSOR-投屏软件

    前言 使用Vysor软件进行投屏 无需root 示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 Vysor是什么 xff1f vysor是一个免root实现电脑控制手机的chrome插件 xff0c 不需要root
  • Camera ZSL

    camera的ZSL是什么 ZSL Zero Shutter Lag 零快门延迟 ubiFocus 高通对照片后期的一种处理技术 xff0c 可以利用多张照片来实现拍照不对焦 xff0c 拍好之后随便选择对焦点的功能 原文链接 xff1a
  • Unity3D中uGUI事件系统简述及使用方法总结

    Unity3D的uGUI系统的将UI可能触发的事件分为12个类型 xff0c 即EventTriggerType枚举的12个值 如下图所示 xff1a 先以PointerClick为例 这个是用于某点点击事件 其他事件都可以根据相同的办法调
  • USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装

    USB全 称Universal Serial Bus xff08 通用串行总线 xff09 xff0c 目前USB 2 0接口分为四种类型A型 B型 Mini型还有后来补充的Micro型接口 xff0c 每种接口都分插头和插座两个部分 xf
  • UVC摄像头开发(一)

    近期 xff0c 要做一个usb摄像头的开发 xff0c 然后看了韦东山老师的第三期视频 xff0c 讲UVC协议摄像头开发的教程 做一些记录 xff0c 以免忘记 1 当我们拿到一个摄像头 xff0c 怎么知道它的一些信息呢 xff1f
  • 分析锂电池充放电保护电路的特点及工作原理

    锂在元素周期表上位于第3位 xff0c 因外层电子数为1个 xff0c 容易失去从而形成稳定结构 xff0c 故锂是一种非常活泼的金属 由锂元素制成的锂离子电池 xff0c 具有放电电流大 内阻低 寿命长 无记忆效应等优点 xff0c 现已
  • vscode相关配置

    转载 作者 ifredom 原文链接 xff1a https blog csdn net win7583362 article details 79315055 配置详解 editor是针对vscode的风格设置 例如 tabSize xf
  • odroid x2安装ubuntu系统,HDMI显示,说说折腾事儿。

    安装的是Lubuntu14 04 xff0c odroid官网有下载 xff0c 烧写软件用官网下载的win32disk imager for odroid 不要用通用的win32disk image 可能不行 write烧写完毕之后记得v
  • VC http post 文件到服务器

    首先引入 include 34 afxinet h 34 其次准备好HTTP POST服务器 STDMETHODIMP CPostPDFToA4 t5PostPDFToA4 BSTR strFileName BSTR strFileFull