// SendData.cpp: implementation of the CSendData class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SendData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSendData::CSendData()
{
m_lpUTF8 = NULL; //UTF8编码缓存指针
m_lpMultiByte = NULL; //
m_wpWideChar = NULL; //Widechar编码缓存指针
//服务器默认值
_tcscpy(m_tzServerName,_T("www.lilu.name"));
_tcscpy(m_tzObjectName,_T("/posttest.asp"));
m_nPort = INTERNET_DEFAULT_HTTP_PORT;
m_strBoundary = _T("-------------2389jhrwfjsjd9823");
}
CSendData::~CSendData()
{
//如果原先的数据没有删除
if (m_lpUTF8)
{
delete [] m_lpUTF8;
m_lpUTF8 = NULL;
}
//如果原先的数据没有删除
if (m_lpMultiByte)
{
delete [] m_lpMultiByte;
m_lpMultiByte = NULL;
}
//宽字节代码指针
if (m_wpWideChar)
{
delete []m_wpWideChar;
m_wpWideChar = NULL;
}
}
//设置服务器参数
void CSendData::SetServerParam(TCHAR ServerName[], TCHAR ObjectName[], WORD Port)
{
_tcscpy(m_tzServerName,ServerName);
_tcscpy(m_tzObjectName,ObjectName);
m_nPort = Port;
}
//发送数据
//编码参数:1表示GB2312,2表示UTF8
DWORD CSendData::PostDataMethod(LPCTSTR strDataSend,
int DataSize,
LPTSTR *pRecvData,
DWORD &RecvSize,
int SendCode, //发送时的编码
int RecvCode //接收返回时的编码
)
{
//返回错误代码列表:
//100:正常成功
//101:服务器无法连接
//102:提交页面无法打开
//103:数据发送失败
//104:服务器处理失败
//500:异常错误
CInternetSession InternetSession;
CHttpConnection *pHttp = NULL;
CHttpFile *pFile = NULL;
DWORD nRetCode = 100; //返回值
TCHAR tzErrMsg[MAX_PATH] = {0}; // 捕捉异常
string strResponse; //接收的数据
try
{
pHttp = InternetSession.GetHttpConnection(m_tzServerName,m_nPort);
if (pHttp == NULL)
{
return 101;
}
pFile = pHttp->OpenRequest(CHttpConnection::HTTP_VERB_POST,m_tzObjectName,NULL);
if (pFile == NULL)
{
return 102;
}
CString strHeader = _T("Content-Type: application/x-www-form-urlencoded");
//////////////////////////////////////////////////////////////////////////
//发送时采用GB2312
if (SendCode == 1)
{
#ifdef UNICODE
WideToMulti((LPCWSTR)(LPCTSTR)strDataSend,DataSize);
#else
MultiToMulti((LPCSTR)(LPCTSTR)strDataSend,DataSize);
#endif
//发送
if (pFile->SendRequest(strHeader,m_lpMultiByte,m_nMultiByteLen) == FALSE)
{
return 103;
}
}
//发送时选择UTF8
else if (SendCode == 2)
{
#ifdef UNICODE
WideCharToUTF8((LPCWSTR)(LPCTSTR)strDataSend,DataSize);
#else
MultiByteToUTF8((LPCSTR)(LPCTSTR)strDataSend,DataSize);
#endif
//发送
if (pFile->SendRequest(strHeader,m_lpUTF8,m_nUTF8Len) == FALSE)
{
return 103;
}
}
//查询状态
DWORD dwStatusCode = 0;
pFile->QueryInfoStatusCode(dwStatusCode);
if (dwStatusCode != 200)
{
return 104;
}
//////////////////////////////////////////////////////////////////////////
//接收数据
char szRead[1024] = {0};
while((pFile->Read(szRead,1023)) > 0)
{
strResponse += szRead;
}
//转换接收的数据
//接收采用GB2312编码
if (RecvCode == 1)
{
#ifdef UNICODE
MultiToWide(strResponse.c_str(),strResponse.length());
*pRecvData = (LPTSTR)m_wpWideChar;
RecvSize = m_nWideCharLen;
#else
MultiToMulti(strResponse.c_str(),strResponse.length());
*pRecvData = (LPTSTR)m_lpMultiByte;
RecvSize = m_nMultiByteLen;
#endif
}
//接收采用UTF8编码
else if (RecvCode == 2)
{
#ifdef UNICODE
UTF8ToWideChar(strResponse.c_str(),strResponse.length());
*pRecvData = (LPTSTR)m_wpWideChar;
RecvSize = m_nWideCharLen;
#else
UTF8ToMultiByte(strResponse.c_str(),strResponse.length());
*pRecvData = (LPTSTR)m_lpMultiByte;
RecvSize = m_nMultiByteLen;
#endif
}
//返回值
nRetCode = 100;
}
//捕获异常
catch (CInternetException* e)
{
e->GetErrorMessage(tzErrMsg,sizeof(tzErrMsg));
e->Delete();
nRetCode = 500;
}
//////////////////////////////////////////////////////////////////////////
//关闭
pFile->Close();
delete pFile;
pHttp->Close();
delete pHttp;
InternetSession.Close();
return nRetCode;
}
//提交图片,自己构造数据包
DWORD CSendData::PostPicDataMethod(TCHAR PicPath[],LPCTSTR pPostName,
LPTSTR *pRecvData, DWORD &RecvSize,
int SendCode ,int RecvCode)
{
//99:图片不存在
//100:正常成功
//101:服务器无法连接
//102:提交页面无法打开
//103:数据发送失败
//104:服务器处理失败
//500:异常错误
DWORD dwRetCode = 100;
DWORD dwPostSize = 0; //要传送的数据大小
DWORD dwPicSize = 0; //图片大小
DWORD dwPostEndSize = 0; //协议尾部数据长度
CInternetSession InternetSession;
CHttpConnection *pHttp = NULL;
CHttpFile *pFile = NULL;
TCHAR tzErrMsg[MAX_PATH] = {0}; // 捕捉异常
string strResponse; //接收的数据
//获取图片大小
dwPicSize = GetExistPic(PicPath);
//构造数据包
MakeHeaderData();
MakePostPicData(pPostName,PicPath); //在原有数据包后面加上图片前缀包
MakeEndData();
//数据包构造完毕
try
{
pHttp = InternetSession.GetHttpConnection(m_tzServerName,m_nPort);
if (pHttp == NULL)
{
return 101;
}
pFile = pHttp->OpenRequest(CHttpConnection::HTTP_VERB_POST,m_tzObjectName,NULL);
if (pFile == NULL)
{
return 102;
}
pFile->AddRequestHeaders(m_strHeaderData);
//////////////////////////////////////////////////////////////////////////
//发送时采用GB2312
if (SendCode == 1)
{
#ifdef UNICODE
WideToMulti((LPCWSTR)(LPCTSTR)m_strPostData,m_strPostData.GetLength());
//计算尾部数据长度
dwPostEndSize = WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(LPCTSTR)m_strEndData,m_strEndData.GetLength(),NULL,0,NULL,NULL);
#else
MultiToMulti((LPCSTR)(LPCTSTR)m_strPostData,m_strPostData.GetLength());
dwPostEndSize = m_strEndData.GetLength();
#endif
//由于协议尾部只有英文数据,在unicode、UTF8、ASCII编码下,
//英文数据转换后长度不变,因此可直接加上长度。
//获取尾部数据转为UTF8后的长度
dwPostSize = dwPicSize + m_nMultiByteLen + dwPostEndSize;
//发送,告知数据总长度
pFile->SendRequestEx(dwPostSize);
pFile->Write(m_lpMultiByte,m_nMultiByteLen);
}
//发送时选择UTF8
else if (SendCode == 2)
{
#ifdef UNICODE
WideCharToUTF8((LPCWSTR)(LPCTSTR)m_strPostData,m_strPostData.GetLength());
dwPostEndSize = WideCharToMultiByte(CP_UTF8,0,(LPCWSTR)(LPCTSTR)m_strEndData,m_strEndData.GetLength(),NULL,0,NULL,NULL);
#else
//这个麻烦,要转两道,直接用函数转算了。
MultiByteToUTF8((LPCSTR)(LPCTSTR)m_strEndData,m_strEndData.GetLength());
dwPostEndSize = m_nUTF8Len;
MultiByteToUTF8((LPCSTR)(LPCTSTR)m_strPostData,m_strPostData.GetLength());
#endif
dwPostSize = dwPicSize + m_nUTF8Len + dwPostEndSize;
//发送
pFile->SendRequestEx(dwPostSize);
pFile->Write(m_lpUTF8,m_nUTF8Len);
}
//////////////////////////////////////////////////////////////////////////
//发送图片
//缓存大小
int BuffSize = 8 * 1024;
if (dwPicSize != 0)
{
char *pbuff = new char[BuffSize];
CFile cFile;
UINT ReadLength = -1;
if (pbuff != NULL)
{
if (cFile.Open(PicPath,CFile::modeRead|CFile::shareDenyWrite,NULL))
{
while(ReadLength !=0)
{
ReadLength = cFile.Read(pbuff,BuffSize);
if (ReadLength != 0)
{
pFile->Write(pbuff,ReadLength);
}
}
cFile.Close();
}
//删除堆
delete []pbuff;
pbuff = NULL;
}
}
//////////////////////////////////////////////////////////////////////////
没有合适的资源?快使用搜索试试~ 我知道了~
UploadPhoto实例加源码
共16个文件
h:5个
cpp:4个
dsp:1个
5星 · 超过95%的资源 需积分: 9 513 下载量 134 浏览量
2014-04-02
07:54:52
上传
评论 4
收藏 24KB RAR 举报
温馨提示
UploadPhoto实例加源码 适合做网页自动填表等扩展程序参考.关于代码的详细讲解在: http://blog.csdn.net/ypist/article/details/8112501
资源推荐
资源详情
资源评论
收起资源包目录
UploadPhoto实例加源码.rar (16个子文件)
UploadPhoto实例加源码
StdAfx.h 999B
UploadPhoto.rc 6KB
UploadPhoto.dsp 4KB
res
UploadPhoto.rc2 403B
UploadPhoto.ico 1KB
UploadPhoto.clw 2KB
SendData.h 2KB
SendData.cpp 16KB
UploadPhoto.exe 24KB
UploadPhoto.dsw 547B
UploadPhoto.h 1KB
UploadPhotoDlg.h 1KB
resource.h 1KB
UploadPhoto.cpp 2KB
UploadPhotoDlg.cpp 6KB
StdAfx.cpp 213B
共 16 条
- 1
pinggle
- 粉丝: 353
- 资源: 48
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开关电源拓朴图表,各种电路拓扑表格
- 登录和注册 前端:vue3+iview plus +axios 后台:spring boot +mybatis
- 软件测试入门简介:从基础到实践的全面介绍
- 2024CDA Level Ⅰ 认证考试大纲
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页