您的位置:首页 > 理论基础 > 计算机网络

使用MFC提供的Http类下载和上传文件

2014-07-17 15:10 381 查看
转载地址:http://www.cppblog.com/zgysx/archive/2006/09/28/13088.html

1、下载文件

Download(const CString& strFileURLInServer, //待下载文件的URL

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();

if(pHttpConnection != NULL)

pHttpConnection->Close();

session.Close();

return true;

}

2、上传文件

UploadFile(LPCTSTR strURL, //负责接收上传操作的页面的URL

LPCTSTR strLocalFileName) //待上传的本地文件路径

{

ASSERT(strURL != NULL && strLocalFileName != NULL);

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;

bResult = AfxParseURL(strURL, dwType, strServer, strObject, wPort);

if(!bResult)

return FALSE;

CFile file;

try

{

if(!file.Open(strLocalFileName, CFile::shareDenyNone | CFile::modeRead))

return FALSE;

dwFileLength = file.GetLength();

if(dwFileLength <= 0)

return FALSE;

pFileBuff = new char[dwFileLength];

memset(pFileBuff, 0, sizeof(char) * dwFileLength);

file.Read(pFileBuff, dwFileLength);

const int nTimeOut = 5000;

cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //联接超时设置

cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试1次

pHC = cis.GetHttpConnection(strServer, wPort); //取得一个Http联接

pHF = pHC->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);

if(!pHF->SendRequest(NULL, 0, pFileBuff, dwFileLength))

{

delete[]pFileBuff;

pFileBuff = NULL;

pHF->Close();

pHC->Close();

cis.Close();

return FALSE;

}

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 bResult;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: