zoukankan
html css js c++ java
[转]使用MFC提供的Http类下载和上传文件
使用MFC提供的Http类下载和上传文件
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;
}
查看全文
相关阅读:
洛谷 P1014 Cantor表 Label:续命模拟QAQ
NOIp 2012 #2 借教室 Label:区间修改线段树
洛谷 P1012 拼数 Label:续命模拟QAQ
如何自定义报表动作的打开方式
openerp import l field size limit
如何在search中动态的显示和隐藏tree中的字段
Centos yum install
openerp binary filed import export
openerp service install
SSH config
原文地址:https://www.cnblogs.com/wubiyu/p/1255186.html
最新文章
18.12.20 DSA Cartesian Tree
18.12.20 DSA 正方形
18.12.20 DSA 重要逆序对
python 用字符串导入函数
python zipfile & tarfile
python sys.path.append
replace_code-3
replace_code
re 匹配代码的正则表达式
Python Xml
热门文章
Python 模块中的一些全局变量
python hashlib
python sys
洛谷 P1029 最大公约数和最小公倍数问题 Label:Water&&非学习区警告
洛谷 P1433 吃奶酪 Label:dfs && 剪枝Ex
洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查
洛谷 P1033 自由落体 Label:模拟&&非学习区警告
51Nod 1002 数字三角形 Label:水水水 && 非学习区警告
洛谷 P1546 最短网络 Agri-Net Label:Water最小生成树
洛谷 P1015 回文数 Label:续命模拟QAQ
Copyright © 2011-2022 走看看