怎么用CHttpConnection,CInternetSession,CHttpFile类做HTTP Server下载?
怎么用CHttpConnection,CInternetSession,CHttpFile类做HTTP Server下载?
我的问题
怎样利用CHttpFile来下载HTTP的文件?
请你给出步骤即可。谢谢各位了。
问题点数:20、回复次数:9Top
1 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-08-17 15:27:43 得分 10
//==========> 初始化回话
HINTERNET hSession=::InternetOpen("Http",
PRE_CONFIG_INTERNET_ACCESS,
"",
INTERNET_INVALID_PORT_NUMBER,
0);
if(hSession==NULL){
AfxMessageBox("Internet session initalization failed!");
return 1;
}
//==========> 创建链接
HINTERNET hConnect=::InternetConnect(hSession,
pDlg->m_strServer,
INTERNET_INVALID_PORT_NUMBER,
"",
"",
INTERNET_SERVICE_HTTP,
0,
0);
if(hConnect==NULL){
AfxMessageBox("Internet connect initialization failed!");
VERIFY(::InternetCloseHandle(hSession));
return 1;
}
//==========> 打开请求链接
HINTERNET hHttpFile=::HttpOpenRequest(hConnect,
"GET",
pDlg->m_strPath,
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE,
0);
if(hHttpFile==NULL){
AfxMessageBox("Http request failed!");
VERIFY(::InternetCloseHandle(hConnect));
VERIFY(::InternetCloseHandle(hSession));
return 1;
}
//==========> 发送请求
BOOL bSendRequest=::HttpSendRequest(hHttpFile,
NULL,
0,
0,
0);
if(bSendRequest){
char achQueryBuf[16];
DWORD dwFileSize;
DWORD dwQueryBufLen=sizeof(achQueryBuf);
BOOL bQuery=::HttpQueryInfo(hHttpFile,
HTTP_QUERY_CONTENT_LENGTH,
achQueryBuf,
&dwQueryBufLen,
NULL);
if(bQuery){
dwFileSize=(DWORD)atol(achQueryBuf);
}
else{
dwFileSize=10*1024;
}
char* lpszBuf=new char[dwFileSize+1];
DWORD dwBytesRead;
//==========> 读取文件
BOOL bRead=::InternetReadFile(hHttpFile,
lpszBuf,
dwFileSize+1,
&dwBytesRead);
Top
2 楼hucaiyu()回复于 2005-08-17 15:39:32 得分 0
先谢你了,我试试看。全用API。Top
3 楼i_noname(晚九朝五)回复于 2005-08-17 15:45:57 得分 10
char szHtm[1024]; //缓存
szHtm[1023] = '\0';
CString strHtm = "";
CInternetSession sess;
CHttpFile* pF;
TRY
{
pF = (CHttpFile *)sess.OpenURL(strUrl);
while (pF->Read(szHtm, 1023) != 0)
{
strHtm += szHtm;
}
}
CATCH(CInternetException, e)
{
MessageBox("连接出错!");
return;
}
END_CATCH
pF->Close();
if (pF != NULL)
{
delete pF;
}
sess.Close();
Top
4 楼hucaiyu()回复于 2005-08-19 13:55:54 得分 0
TO:horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))
现在程序已经调式通过,但问题有以下几点:
1。只能完整下载html类型的文件,不能完整下载其他类型的文件;
2。当新建立本地文件后,一般要写2次才能成功。如果文件已经存在,经替换后,
可以一次写入成功;
3。 //==========> 打开请求链接
HINTERNET hHttpFile=::HttpOpenRequest(
hConnect,
"GET",
pDlg->m_strPath,
0,//我想换成http/2.0,怎么做??
URL,
(TCHAR)"text/*",//lplpszAcceptTypes,怎样接受其他类型的文件??
INTERNET_FLAG_DONT_CACHE,
0);
谢谢了Top
5 楼i_noname(晚九朝五)回复于 2005-08-19 14:01:58 得分 0
从连接中得到的都是二进制数据没有类型的区别,你读http就保存成http文件,读到jpg就存成jpg文件,这是写文件时的区别。Top
6 楼hucaiyu()回复于 2005-08-19 14:12:55 得分 0
lplpszAcceptTypes
[in] Long pointer to a null-terminated array of string pointers indicating content types accepted by the client. If this parameter is NULL, no types are accepted by the client. Servers interpret a lack of accept types to indicate that the client accepts only documents of type "text/*" (that is, only text documents, and not pictures or other binary files).
////////////////////////////////
Servers interpret a lack of accept types to indicate that the client accepts only documents of type "text/*"
那这句话该怎样正确翻译呢?没看明白Top
7 楼hucaiyu()回复于 2005-08-19 14:33:33 得分 0
TO:i_noname(晚九朝五)
////////////////////////////
while (pF->Read(szHtm, 1023) != 0)
{
strHtm += szHtm;
}
如果我要下载的文件有10MB,那strHtm的长度也不成了10MB??Top
8 楼i_noname(晚九朝五)回复于 2005-08-20 15:28:51 得分 0
回楼上,你不一定要用strHtm来保存啊,可以直接写在文件中的。
while (pF->Read(szHtm, 1023) != 0)
{
File.Write(szHtm,1024);
}
Top
9 楼hucaiyu()回复于 2005-08-22 17:51:24 得分 0
我下载是直接写到文件里面了。这个方法很简单很实用。
谢谢楼上的兄弟。。。Top




