阿帕奇服务器文件上传,windows基于阿帕奇+PHP服务器,实现vc++文件上传功能
如何安装和配置阿帕奇服务器
如何安装和配置PHP服务器
PHP服务端程序
在upload_file.php里写代码如下:
//$file = $_GET['filename'];
//file_put_contents("aaa.txt", var_export($file,true));
file_put_contents("abb.txt", var_export($_FILES,true));
upload_file();
function upload_file()
{
$error;
if ($_FILES["trackdata"]["error"] > 0)
{
//echo "Error: " . $_FILES["trackdata"]["error"] . "
";
$error = "200";
}
else
{
//echo "Upload: " . $_FILES["trackdata"]["name"] . "
";
//echo "Type: " . $_FILES["trackdata"]["type"] . "
";
//echo "Size: " . ($_FILES["trackdata"]["size"] / 1024) . " Kb
";
//echo "Stored in: " . $_FILES["trackdata"]["tmp_name"]. "
" ;
}
if (file_exists("upload/" . $_FILES["trackdata"]["name"]))
{
//echo $_FILES["trackdata"]["name"] . " already exists. ";
$error = "201";
}
else
{
move_uploaded_file($_FILES["trackdata"]["tmp_name"],"upload/" . $_FILES["trackdata"]["name"]);
//echo "Stored in: " . "upload/" . $_FILES["trackdata"]["name"];
$error = 202;
}
echo $error ;
return $error;
}
?>
这个代码比较基本,也就是一个demo,不过还是要感谢北京做php的那个哥们的热心帮助。
c++客户端程序
先上代码:
1.请求消息头函数:
CString CDlgUpFile::MakeRequestHeaders1(CString& strBoundary)
{
CString strFormat;
CString strData;
strFormat = _T("Content-Type: multipart/form-data; boundary=%s\r\n");
strData.Format(strFormat, strBoundary);
return strData;
}
2.数据头函数:
CString CDlgUpFile::MakePreFileData1(CString& strBoundary, CString& strFileName, int iRecordID)
{
CString strFormat;
CString strData;
strFormat += _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"recordid\"");
strFormat += _T("\r\n\r\n");
strFormat += _T("%d");
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: audio/wav");
strFormat += _T("Content-Type: application/x-www-form-urlencoded");
strFormat += _T("\r\n");
strFormat += _T("Content-Transfer-Encoding: binary");
strFormat += _T("\r\n\r\n");
strData.Format(strFormat, strBoundary, iRecordID, strBoundary, strFileName);
return strData;
}
3.数据结束函数:
CString CDlgUpFile::MakePostFileData1(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;
}
4.上传函数:
//上传文件数据至HTTP服务器
int CDlgUpFile::UploadFile1(const CString &szServerURL, const CString &szUploadFileName,CString &szRecvData)
{
if (szServerURL.IsEmpty() || szUploadFileName.IsEmpty())
{
return -1;
}
BOOL bRet = FALSE;
DWORD dwServiceType = 0;
CString strServer = _T("");
CString strObject = _T("");
INTERNET_PORT nPort = 0;
bRet = AfxParseURL(szServerURL, dwServiceType, strServer, strObject, nPort);
if(!bRet)
{
return -2;
}
int nRet = 0;
CInternetSession Session;
CHttpConnection * pHttpConnection = NULL;
CFile fTrack;
CHttpFile* pHTTPFile = NULL;
CString strHTTPBoundary = _T("");
CString strPreFileData = _T("");
CString strPostFileData = _T("");
DWORD dwTotalRequestLength;
DWORD dwChunkLength = 0;
DWORD dwReadLength = 0;
DWORD dwResponseLength = 0;
TCHAR szError[MAX_PATH] = {0};
void* pBuffer = NULL;
LPSTR szResponse = NULL;
CString strResponse = _T("");
BOOL bSuccess = TRUE;
CString strDebugMessage = _T("");
if (FALSE == fTrack.Open(szUploadFileName, CFile::modeRead | CFile::shareDenyWrite))
{
//AfxMessageBox(_T("Unable to open the file."));
return -3;
}
int nPos = szUploadFileName.ReverseFind('\\');
CString strFileName = szUploadFileName.Mid(nPos+1);//不带路径的文件名
int iRecordID = 1;
strHTTPBoundary = _T("----istroop----");
strPreFileData = MakePreFileData1(strHTTPBoundary, strFileName, iRecordID);
strPostFileData = MakePostFileData1(strHTTPBoundary);
m_dwFileSize = fTrack.GetLength();
dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + m_dwFileSize;
dwChunkLength = 64 * 1024;
pBuffer = malloc(dwChunkLength);
if (NULL == pBuffer)
{
fTrack.Close();
return -4;
}
try
{
pHttpConnection = Session.GetHttpConnection(strServer,nPort);
pHTTPFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
pHTTPFile->AddRequestHeaders(MakeRequestHeaders1(strHTTPBoundary));
pHTTPFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
#ifdef _UNICODE
USES_CONVERSION;
pHTTPFile->Write(W2A(strPreFileData), strPreFileData.GetLength());
#else
pHTTPFile->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());
#endif
dwReadLength = -1;
m_dwUploadSize = 0;
while (0 != dwReadLength)
{
// strDebugMessage.Format(_T("%u / %un"), fTrack.GetPosition(), fTrack.GetLength());
// TRACE(strDebugMessage);
dwReadLength = fTrack.Read(pBuffer, dwChunkLength);
if (0 != dwReadLength)
{
m_dwUploadSize += dwReadLength;
pHTTPFile->Write(pBuffer, dwReadLength);
}
}
#ifdef _UNICODE
pHTTPFile->Write(W2A(strPostFileData), strPostFileData.GetLength());
#else
pHTTPFile->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endif
pHTTPFile->EndRequest(HSR_SYNC);
dwResponseLength = pHTTPFile->GetLength();
while (0 != dwResponseLength)
{
szResponse = (LPSTR)malloc(dwResponseLength + 1);
szResponse[dwResponseLength] = '\0';
pHTTPFile->Read(szResponse, dwResponseLength);
strResponse += szResponse;
free(szResponse);
szResponse = NULL;
dwResponseLength = pHTTPFile->GetLength();
}
szRecvData = strResponse;
}
catch (CException* e)
{
// e->GetErrorMessage(szError, MAX_PATH);
// e->Delete();
nRet = -5;
}
if (NULL != pHTTPFile)
{
pHTTPFile->Close();
delete pHTTPFile;
pHTTPFile = NULL;
}
fTrack.Close();
if (NULL != pBuffer)
{
free(pBuffer);
pBuffer = NULL;
}
return nRet;
}
代码分析
1.http协议部分
CInternetSession Session;
CHttpConnection * pHttpConnection = NULL;
CHttpFile* pHTTPFile = NULL;
pHttpConnection = Session.GetHttpConnection(strServer,nPort);
pHTTPFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
pHTTPFile->AddRequestHeaders(MakeRequestHeaders1(strHTTPBoundary));
pHTTPFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
这里用到了CInternetSession、CHttpConnection、CHttpFile。
2.文件操作
用的是CFile fTrack;
3.数据传送
消息头:
pHTTPFile->AddRequestHeaders(MakeRequestHeaders1(strHTTPBoundary));
请求数据长度:
pHTTPFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
数据头:
#ifdef _UNICODE
USES_CONVERSION;
pHTTPFile->Write(W2A(strPreFileData), strPreFileData.GetLength());
#else
pHTTPFile->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());
#endif
文件数据,循环读取文件和发送:
dwReadLength = fTrack.Read(pBuffer, dwChunkLength);
if (0 != dwReadLength)
{
m_dwUploadSize += dwReadLength;
pHTTPFile->Write(pBuffer, dwReadLength);
}
文件结束:
#ifdef _UNICODE
pHTTPFile->Write(W2A(strPostFileData), strPostFileData.GetLength());
#else
pHTTPFile->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endif
阿帕奇服务器文件上传,windows基于阿帕奇+PHP服务器,实现vc++文件上传功能相关推荐
- linux服务器批量文件上传,Windows定时任务下载linux服务器批量文件到本地
编写批文件 1.1 编写main.bat文件 E: cd logs ftp -n -s:"E:\logs\mget.bat" 1.2 编写mget.bat文件 open ip地址 ...
- axios文件上传 formdata_基于业务场景下的图片/文件上传方案总结
图片/文件上传组是企业项目开发中必不可少的环节之一, 但凡涉及到用户模块的都会有图片/文件上传需求, 在很多第三方组件库(ant desigin, element ui)中它也是基础组件之一. 接下来 ...
- python程序发布 ubuntu_将Windows项目发布到Ubuntu服务器详细教程(Windows编程,Ubuntu服务器做解释器)...
前期准备 (1)专业版Pycharm(社区版没有deployment功能),学生,教师可申请免费专业版,详情可看我的博客. (2)可通过SSH连接Ubuntu服务器,并且服务器安装了Python解释器 ...
- 2003系统服务器,雨林木风 windows server 2003企业版服务器系统
1.雨林木风 windows server 2003企业版服务器系统 在WindowsServer2003中,群集安裝和设置更容易也更安全可靠,而该产品的提高网络功能提供了更强的常见故障迁移能力和更长 ...
- linux服务器运维操作命令,Windows和Linux系统服务器运维基本操作指令
原标题:Windows和Linux系统服务器运维基本操作指令 服务器总归是机械化设备,在运行过程中难免会出现一些问题,遇到这些问题怎么办?请运维人员代维修?即使请也会造成,运维人员维护不及时和成本太高 ...
- 服务器基本搭建(Windows系统阿里云服务器为例)-购买云服务器
说明 云服务器: 就是一台电脑,和咱使用的是一样的.云服务器实际上最终还是物理机,只不过物理机是服务商的,服务商负责维护运行. 服务商提供了网页端让咱去购置和选型,购置完以后就可以登录使用. 云服务器 ...
- 怎样用计算机传输文件,如何使用 Windows 轻松传送在计算机之间移动文件
本文提供有关使用轻松文件传输功能将数据从旧计算机传输到新计算机的信息.Windows Vista.Windows 7 和 Windows 8.1 上提供此 Windows 功能.Windows 10 ...
- 【技术贴】asms文件,安装windows xp原版时,需要“asms”文件,H:\I386\asm
[技术贴]安装windows xp原版时,需要"asms"文件,H:\I386\asms的解决办法..xcopy *.* c:\i386\asms......参数错误,文件失败. ...
- 技术贴】asms文件,安装windows xp原版时,需要“asms”文件,解决办法。。
http://ae6623.blog.163.com/blog/static/169098711201062651051706/ [技术贴]安装windows xp原版时,需要"asms&q ...
- 一台windows机器和一台linux机器之间互相拷贝文件的方法,windows系统和Linux系统之间拷贝文件***--pscp...
putty secure copy == pscp,是putty提供的文件传输***,通过ssh两件,在两台机器之间安全传输文件 获取pscp工具:http://www.chiark.greenend ...
最新文章
- The application's PagerAdapter changed the adapter's contents without calling notifyDataSetChanged
- G - 数据结构实验之排序七:选课名单
- 采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy
- (JAVA)String类之比较方法(2)
- 计网期末复习 - 发送时延和传播时延计算
- Spring IOC之Bean初始化篇
- 45岁以后的IT人生
- MATLAB深度学习工具箱文档——trainingOptions函数的参数设置
- Javascript分页:模拟后台返回数据方法
- iPad出现问题时,如何恢复出厂设置怎么操作?
- 论文笔记:Stacked Hourglass Networks for Human Pose Estimation
- docker的一些使用技巧
- 中科院NIPS 2017论文提出深度离散哈希算法,可用于图像检索:Deep Supervised Discrete Hashing
- java拼图游戏ai_拼图游戏和它的AI算法
- 【python教程】requests库的基本用法
- (创建型)2、原型模式(返回原对象的克隆体,不直接返回原对象)
- 【物联网服务NodeJs-5天学习】第四天存储篇④ ——基于MQTT的环境温度检测,升级存储为mysql
- 个人用户如何保证企业邮箱安全?【163企业邮箱注册】
- 访问服务器共享文件夹报错,文件夹共享设置方法及排错集合
- 机器学习中最常用的矩阵/向量求导公式
热门文章
- android模拟机神器[Genymotion]的使用
- VS2015社区版资源
- c语言 函数-斐波那契数列,c语言斐波那契数列递归法(示例代码)
- C语言 实验六 函数
- stm32单片机学习笔记(模块学习一——舵机SG90)
- 2022最新淘宝天猫商品sku精准库存(sku库存200)
- 生成PDF并上传到图片服务器
- 用实际程序来测试udp sendto函数的最大发包大小------为什么是65507?
- 计算机网课课堂评价语,网络授课如何“高效”评价学生作业(附实用评语)
- X509证书结构及解析