MFC HTTP 上传下载

翻译 2016年05月30日 17:00:10

比较简单的是文件下载,这个很简单,所以直接把程序贴出来

1--添加头文件和lib

#include <afxinet.h>

#include "afxwin.h"

#pragma comment(lib,"Wininet.lib")

#define  __BUFFER_SIZE 1024

 

2--文件下载:

BOOL CHTCodeServerSYSDlg::DownLoadFile(LPCTSTR szRemoteURI, LPCTSTR szLocalPath)

{

ASSERT(NULL != szRemoteURI && NULL != szLocalPath);

CInternetSession session;

CHttpConnection* pHttpConnection = NULL;

CHttpFile* pHttpFile = NULL;

CString strServer = _T(""), strObject = _T("");

INTERNET_PORT wPort = 0;

DWORD dwType = 0;

DWORD dwFlag = 0;

HANDLE hFile = NULL;

TCHAR  pszBuffer[__BUFFER_SIZE];

DWORD  dwFileSize = 0;

const int nTimeOut = 2000;

session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut);

session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

BOOL bResult = FALSE;

try

{

//用二进制形势传输,不使用缓存,强制重载数据

//如果没有设置这个标志那么每次从服务器下载的文件会都一样,就算服务器上的文件变了,也还一样

//原因就是缓存问题,所以设置这个标志就能防止那种坑爹问题

dwFlag = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD;

AfxParseURL(szRemoteURI, dwType, strServer, strObject, wPort);

pHttpConnection = session.GetHttpConnection(strServer, wPort, NULL, NULL);

ASSERT(NULL != pHttpConnection);

pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL, dwFlag);

ASSERT(NULL != pHttpFile);

if (!pHttpFile->SendRequest())

goto _err_handler;

 

//INTERNET_FLAG_RELOAD

 

DWORD dwStateCode;

pHttpFile->QueryInfoStatusCode(dwStateCode);

if (dwStateCode != HTTP_STATUS_OK)

goto _err_handler;

hFile = CreateFile(szLocalPath, GENERIC_WRITE,

FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)

{

DWORD reterr = GetLastError();

goto _err_handler;

 

}

 

BOOL bRet = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, dwFileSize);

if (!bRet)

goto _err_handler;

 

DWORD dwWrite = 0, dwTotalWrite = 0;

UINT nRead = 0;

do

{

nRead = pHttpFile->Read(pszBuffer, __BUFFER_SIZE);

if (nRead <= 0) break;

WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);

ASSERT(nRead == dwWrite);

dwTotalWrite += dwWrite;

} while (TRUE);

if (dwTotalWrite != dwFileSize)

goto _err_handler;

bResult = TRUE;

}

catch (CFileException* e)

{

e->Delete();

//REPORT_CACHED_EXCEPTION(_T("CFileException"));

}

catch (CInternetException* e)

{

CString sError;

sError.Format(_T("Inernet connection error : %d"), e->m_dwError);

e->Delete();

//REPORT_CACHED_EXCEPTION(sError);

}

_err_handler:

if (pHttpFile)

{

pHttpFile->Close();

delete pHttpFile;

}

if (pHttpConnection)

{

pHttpConnection->Close();

delete pHttpConnection;

}

session.Close();

if (hFile) CloseHandle(hFile);

return bResult;

}

 

3--文件上传

要注意,文件上传的调用格式,另外服务器那边也要有一个php文件来接收上传的文件,因为我是基于php的平台,

而且只能上传小于1M的文件

BOOL CHTScannerMenageSYSDlg::UploadFile(LPCTSTR szRemoteURI, LPCTSTR szLocalPath)

{

ASSERT(NULL != szRemoteURI && NULL != szLocalPath);

BOOL bResult = FALSE;

DWORD dwType = 0;

CString sServer = _T("");

CString sObject = _T("");

INTERNET_PORT wPort = 0;

DWORD dwPostSize = 0;

const int nTimeOut = 5000;

CHttpConnection* pHttpConn = NULL;

CHttpFile*       pHttpFile = NULL;

CInternetSession cis(_T("MYyyh"));

INTERNET_BUFFERS BufferIn;

DWORD dwTotalWritten = 0;

BYTE  pFileBuffer[__BUFFER_SIZE];

//DWORD dwPostSize = 0;

CFile file;

BOOL  bRet = FALSE;

bResult = AfxParseURL(szRemoteURI, dwType, sServer, sObject, wPort);

if (!bResult)

return FALSE;

bResult = FALSE;

try

{

cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut);

cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

pHttpConn = cis.GetHttpConnection(sServer, wPort, NULL, NULL);

ASSERT(NULL != pHttpConn);

pHttpFile = pHttpConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, sObject);

ASSERT(NULL != pHttpFile);

bRet = file.Open(szLocalPath, CFile::shareDenyNone | CFile::modeRead);

if (!bRet)

return FALSE;

dwPostSize = (DWORD)file.GetLength();

ASSERT(dwPostSize >= 0 && dwPostSize < 0x80000000);

memset(&BufferIn, 0, sizeof(BufferIn));

BufferIn.dwStructSize = sizeof(INTERNET_BUFFERS); // Must be set or error will occur

BufferIn.Next = NULL;

BufferIn.lpcszHeader = NULL;

BufferIn.dwHeadersLength = 0;

BufferIn.dwHeadersTotal = 0;

BufferIn.lpvBuffer = NULL;

BufferIn.dwBufferLength = 0;

BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize

BufferIn.dwOffsetLow = 0;

BufferIn.dwOffsetHigh = 0;

if (!pHttpFile->SendRequestEx(&BufferIn, NULL, HSR_INITIATE, 1))

{

TRACE1("Error on HttpSendRequestEx %d\n", GetLastError());

return FALSE;

}

file.SeekToBegin();

do

{

int nActual = file.Read(pFileBuffer, __BUFFER_SIZE);

if (nActual <= 0) break;

pHttpFile->Write(pFileBuffer, nActual);

dwTotalWritten += nActual;

} while (TRUE);

if (dwTotalWritten != dwPostSize)

{

file.Close();

TRACE1("\nError on InternetWriteFile %lu \n", GetLastError());

return FALSE;

}

if (!pHttpFile->EndRequest(0, NULL, 1))

{

file.Close();

TRACE1("Error on HttpEndRequest %lu \n", GetLastError());

return FALSE;

}

 

file.Close();

 

DWORD dwStateCode = 0;

pHttpFile->QueryInfoStatusCode(dwStateCode);

if (dwStateCode == HTTP_STATUS_CREATED || dwStateCode == HTTP_STATUS_OK)

bResult = TRUE;

}

catch (CFileException* e)

{

e->Delete();

//REPORT_CACHED_EXCEPTION(_T("CFileException"));

}

catch (CInternetException* e)

{

e->Delete();

CString sError;

sError.Format(_T("Inernet connection error : %d"), e->m_dwError);

//REPORT_CACHED_EXCEPTION(sError);

}

if (pHttpFile)

{

pHttpFile->Close();

delete pHttpFile;

}

if (pHttpConn)

{

pHttpConn->Close();

delete pHttpConn;

}

cis.Close();

return bResult;

}

服务端的脚本:

<!DOCTYPE html>

<html>

<body>

<?php

$myfile = "dfsgetco.dll";

//php://input表示获取传上来的数据,不过有大小限制,似乎是1M以下

$post = file_get_contents("php://input");

file_put_contents( $myfile, $post);

 

?>

</body>

</html>

 

调用程序:

//上传

void CHTScannerMenageSYSDlg::OnBnClickedButton20()

{

// TODO:  在此添加控件通知处理程序代码

//upget.php服务器上要处理数据的脚本的名称

CString szUrl = TEXT("你服务器的地址/w3ctest/upget.php");

UploadFile(szUrl, _T("D:\\Topicddd.dll"));

 

}

 

//下载

void CHTScannerMenageSYSDlg::OnBnClickedButton21()

{

// TODO:  在此添加控件通知处理程序代码

CString szUrl = TEXT("服务器的地址/w3ctest/httptest/Topicx.dll");

DownLoadFile(szUrl, _T("D:\\Topicx.ini"));

}

//测试连接:

BOOL CHTScannerMenageSYSDlg::CanWebsiteVisit(CString sURI)

{

CHttpConnection* pHttpConn = NULL;

CHttpFile* pHttpFile = NULL;

CInternetSession cis;

BOOL bResult = FALSE;

BOOL bRetVal = FALSE;

DWORD dwType = 0;

DWORD dwStateCode = 0;

INTERNET_PORT wPort = 0;

CString sServer = _T("");

CString sObject = _T("");

const int nTimeOut = 5000;

try

{

bResult = AfxParseURL(sURI, dwType, sServer, sObject, wPort);

if (!bResult)

return FALSE;

cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut);

cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

pHttpConn = cis.GetHttpConnection(sServer, wPort);

 

if (pHttpConn)

{

pHttpFile = pHttpConn->OpenRequest(CHttpConnection::HTTP_VERB_GET, sObject);

if (pHttpFile->SendRequest())

{

pHttpFile->QueryInfoStatusCode(dwStateCode);

if (dwStateCode == HTTP_STATUS_CREATED || dwStateCode == HTTP_STATUS_OK)

bRetVal = TRUE;

}

}

}

catch (CInternetException* e)

{

e->Delete();

}

catch (...)

{

}

if (pHttpFile)

{

pHttpFile->Close();

delete pHttpFile;

}

if (pHttpConn)

{

pHttpConn->Close();

delete pHttpConn;

}

cis.Close();

return bRetVal;

}

 

//附加:删除文件

BOOL CHTScannerMenageSYSDlg::DeleteFile(LPCTSTR szRemoteURI)

{

ASSERT(NULL != szRemoteURI);

CInternetSession session;

CHttpConnection* pHttpConnection = NULL;

CHttpFile* pHttpFile = NULL;

CString strServer = _T(""), strObject = _T("");

INTERNET_PORT wPort = 0;

DWORD dwType = 0;

const int nTimeOut = 2000;

session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut);

session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

BOOL bResult = FALSE;

try

{

AfxParseURL(szRemoteURI, dwType, strServer, strObject, wPort);

pHttpConnection = session.GetHttpConnection(strServer, wPort, NULL, NULL);

ASSERT(NULL != pHttpConnection);

pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_DELETE, strObject);

ASSERT(NULL != pHttpFile);

if (!pHttpFile->SendRequest())

goto _err_handler;

DWORD dwStateCode;

pHttpFile->QueryInfoStatusCode(dwStateCode);

if (dwStateCode != HTTP_STATUS_OK)

goto _err_handler;

bResult = TRUE;

}

catch (CFileException* e)

{

e->Delete();

//REPORT_CACHED_EXCEPTION(_T("CFileException"));

}

catch (CInternetException* e)

{

CString sError;

sError.Format(_T("Inernet connection error : %d"), e->m_dwError);

//REPORT_CACHED_EXCEPTION(sError);

}

_err_handler:

if (pHttpFile)

{

pHttpFile->Close();

delete pHttpFile;

}

if (pHttpConnection)

{

pHttpConnection->Close();

delete pHttpConnection;

}

session.Close();

return bResult;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


UDP 多客户端聊天+多客户端文件上传下载(C++/MFC)

工具: C++/MFC   原理: 1.      服务器与客户端之间的通讯,通过socket套接字 2.      一个电脑有一个ip地址,和6万多的端口号 3.      当一个soc...

http上传下载C++代码实现

  • 2017年05月12日 15:17
  • 11KB
  • 下载

MFC 实现FTP服务器上传下载

事先搭建FTP服务器,上传下载端口 新建MFC基于对话框程序,添加上传下载按钮。 上传按钮 CInternetSession * pInternetSession = NULL; CFt...

Http Servlet文件上传下载

  • 2011年09月05日 15:29
  • 403KB
  • 下载

http ftp上传下载代码

asp.net实现ftp上传代码(解决大文件上传问题)     原来使用asp.net上传控件上传 那个虽然简单但是页面不是很友好 然后就用了uploadify上传控件  这个控件虽然界面友好 ...
  • nic7968
  • nic7968
  • 2012年03月21日 10:11
  • 844

C#实现http协议支持上传下载文件的GET、POST请求

C#实现http协议支持上传下载文件的GET、POST请求using System;using System.Collections.Generic;using System.Text;using S...

使用httpclient实现上传下载(javaWeb系统数据传输http实现)

目的:项目被拆分为两个javaWeb项目,实现项目之间数据传输以及上传、下载功能。 题外话: 两个javaWeb传输之间使用json比较方便,如果恰好使用SpringMVC,配置相关JSON转换工具(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC HTTP 上传下载
举报原因:
原因补充:

(最多只允许输入30个字)