windows基于阿帕奇服务器,实现vc++文件下载功能
描述
windows基于阿帕奇服务器,实现vc++文件下载功能,要比上传功能简单一些,可以不需要php服务器,只要一个url路径就可以了。
下载函数代码BOOL CDlgTest1::DownloadFileFromServer(const CString& strFileURLInServer, const CString & strFileLocalFullPath){ASSERT(strFileURLInServer != "");ASSERT(strFileLocalFullPath != "");CInternetSession session;CHttpConnection* pHttpConnection = NULL;CHttpFile* pHttpFile = NULL;CString strServer, strObject;INTERNET_PORT wPort;DWORD dwType;const int nTimeOut = 2000;session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试次数char* pszBuffer = NULL; try{AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort);pHttpConnection = session.GetHttpConnection(strServer, wPort);pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);if(pHttpFile->SendRequest() == FALSE)return false;DWORD dwStateCode;pHttpFile->QueryInfoStatusCode(dwStateCode);if(dwStateCode == HTTP_STATUS_OK){HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); //创建本地文件if(hFile == INVALID_HANDLE_VALUE){pHttpFile->Close();pHttpConnection->Close();session.Close();return false;} char szInfoBuffer[1000]; //返回消息DWORD dwFileSize = 0; //文件长度DWORD dwInfoBufferSize = sizeof(szInfoBuffer);BOOL bResult = FALSE;bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,(void*)szInfoBuffer,&dwInfoBufferSize,NULL);dwFileSize = atoi(szInfoBuffer);const int BUFFER_LENGTH = 1024 * 10;pszBuffer = new char[BUFFER_LENGTH]; //读取文件的缓冲DWORD dwWrite, dwTotalWrite;dwWrite = dwTotalWrite = 0;UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据while(nRead > 0){WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件dwTotalWrite += dwWrite;nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);}delete[]pszBuffer;pszBuffer = NULL;CloseHandle(hFile);}else{delete[]pszBuffer;pszBuffer = NULL;if(pHttpFile != NULL){pHttpFile->Close();delete pHttpFile;pHttpFile = NULL;}if(pHttpConnection != NULL){pHttpConnection->Close();delete pHttpConnection;pHttpConnection = NULL;}session.Close();return false;}}catch(...){delete[]pszBuffer;pszBuffer = NULL;if(pHttpFile != NULL){pHttpFile->Close();delete pHttpFile;pHttpFile = NULL;}if(pHttpConnection != NULL){pHttpConnection->Close();delete pHttpConnection;pHttpConnection = NULL;}session.Close();return false;}if(pHttpFile != NULL){pHttpFile->Close();delete pHttpFile;pHttpFile = NULL;}if(pHttpConnection != NULL){pHttpConnection->Close();delete pHttpConnection;pHttpConnection = NULL;}session.Close();return true;}代码分析
1.先调用AfxParseURL来获取URL参数。
2.连接对象
pHttpConnection = session.GetHttpConnection(strServer, wPort);
pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
3.创建本地文件
HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
4.读取服务器上数据
UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据
while(nRead > 0)
{
WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件
dwTotalWrite += dwWrite;
nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
}
测试可以从服务器上下载文件。
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12838023