windows基于阿帕奇+PHP服务器,实现vc++文件上传功能
2013-10-17 11:33
1246 查看
如何安装和配置阿帕奇服务器
请参考:http://blog.csdn.net/wujunokay/article/details/12707259如何安装和配置PHP服务器
请参考:http://blog.csdn.net/wujunokay/article/details/12833127PHP服务端程序
在upload_file.php里写代码如下:<?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"] . "<br />"; $error = "200"; } else { //echo "Upload: " . $_FILES["trackdata"]["name"] . "<br />"; //echo "Type: " . $_FILES["trackdata"]["type"] . "<br />"; //echo "Size: " . ($_FILES["trackdata"]["size"] / 1024) . " Kb<br />"; //echo "Stored in: " . $_FILES["trackdata"]["tmp_name"]. "<br />" ; } 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
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12834649
相关文章推荐
- windows基于阿帕奇服务器,实现vc++文件下载功能
- 基于HTML5+js+Java实现单文件文件上传到服务器功能
- 服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)
- java基于servlet编写上传下载功能 类似文件服务器
- MVC中基于Ajax和HTML5实现文件上传功能
- 简单实现php上传文件功能
- PHP服务器文件管理器开发小结(十):使用jQuery和iframe实现AJAX文件上传
- 配置php.ini实现PHP文件上传功能
- 基于Spring实现文件上传功能
- php+ajax实现图片文件上传功能实例
- J2EE中用户上传文件到服务器功能实现
- php利用iframe实现无刷新文件上传功能的代码
- php+ajax实现图片文件上传功能
- PHP文件上传进度条基于Session与Javascript实现
- 基于Flask实现文件的上传功能的多实例Web服务
- 基于SpringBoot上传任意文件功能的实现
- PHP中使用Session配合Javascript实现文件上传进度条功能
- PHP实现文件上传功能
- Xshell 5+lrzsz实现Windows客户端向CentOS服务器上传文件
- 基于Jquery插件实现跨域异步上传文件功能