如何通过IXMLHTTPRequest下载文件?

ALong_Yue 2002-10-28 01:52:25
例如,通过IXMLHTTPRequest 下载http://www.echinatex.com:8080/learning/wenzai/0001.pdf。最好有代码。
...全文
518 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyilan 2002-11-18
  • 打赏
  • 举报
回复
gz
ALong_Yue 2002-10-30
  • 打赏
  • 举报
回复
upupupup!!!!!!!!!!!!!
ALong_Yue 2002-10-29
  • 打赏
  • 举报
回复
along_yue@hotmail.com. Please send me source code.
microran2000 2002-10-29
  • 打赏
  • 举报
回复
使用上述函数需要使用#include 和#paramga comment(lib,“”)以及#import指令包含链接或者导入一些文件。相信这些对于Visual C++程序员不是意见困难的事情。
microran2000 2002-10-29
  • 打赏
  • 举报
回复
使用XMLHttp发送的方法如下,但是结果不尽人意。
int SendHTTPXML(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer)
{ Buffer->dwSize =0;
Buffer->dwHeadSize =0;
Buffer->lpszResponseBody =NULL;
Buffer->lpszResponseHeader =NULL;
try
{
CoInitialize(NULL);
IXMLHttpRequestPtr pXH = NULL;
HRESULT hr;
if(FAILED(pXH.CreateInstance("Microsoft.XMLHTTP.1")))throw "无法创建XML HTTP实例";
if(Post!=NULL){
hr=pXH->open(_bstr_t("POST"),_bstr_t(URL),CComVariant(VARIANT_FALSE),CComVariant(L""),CComVariant(L""));
if(FAILED(hr))throw "无法使用POST方法!";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}

}
hr=pXH->send(_variant_t((char*)Post));
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=bstrResponseHeaders.length();
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;

nLen=bstrResponseText.length();
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);
Buffer->dwSize=nLen+1;
}
}
else
{
hr=pXH->open(_bstr_t(L"GET"),_bstr_t(URL),_variant_t(VARIANT_FALSE),_variant_t(L""),_variant_t(L""));
if(FAILED(hr))throw "无法使用POST方法!";
char *szBufferHeader=(char*)headers;
char *szBufferLN;
char *szComma;
char szHeader[1024];
char szHeaderValue[1024];
if(headers!=NULL){
while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
szComma=stristrA(szBufferHeader,": ");
strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
szHeader[szComma-szBufferHeader]=0;
szBufferLN=stristrA(szComma,"\r\n");
strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
szHeaderValue[szBufferLN-2-szComma]=0;
hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
szBufferHeader=szBufferLN+2;
}

}
hr=pXH->send();
if(pXH->status >=200 && pXH->status <400){
_bstr_t bstrResponseHeaders;
_bstr_t bstrResponseText;
bstrResponseHeaders=pXH->getAllResponseHeaders();
bstrResponseText=pXH->responseText;
USES_CONVERSION;
int nLen=lstrlen(OLE2CT(bstrResponseHeaders));
Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
Buffer->dwHeadSize =nLen+1;

nLen=lstrlen(OLE2CT(bstrResponseText));
Buffer->lpszResponseBody =(BYTE*) malloc( nLen+1);
ZeroMemory(Buffer->lpszResponseBody,nLen+1);
Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);

Buffer->dwSize=nLen+1;
while(Buffer->lpszResponseBody[nLen-1]!='>')nLen--;
Buffer->lpszResponseBody[nLen]=0;
}
}
}
catch(...)
{//exception handling
if(Buffer->lpszResponseBody!=NULL)free(Buffer->lpszResponseBody);
if(Buffer->lpszResponseHeader!=NULL)free(Buffer->lpszResponseHeader);
CoUninitialize();
return 1;
}

CoUninitialize();

return 0;
}
microran2000 2002-10-29
  • 打赏
  • 举报
回复
我用XMLHttp组件下载或者发送HTTP请求时,经常发生上面的情况,下载不完整,部分内容被截断。我想可能是低版本的MSXML.DLL胎里带的原因。
为了接收完整的应答数据,我习惯使用WinINET API函数,使用这个函数最大的优势在于它支持HTTPS协议。
下面是我编写的这个函数,可能很多地方需要完善。
int SendHTTP(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer,BOOL bRedirect,LPCSTR szSuccessMsg,LPCSTR szErrorMsg)
{
HINTERNET hInternetSession;
Buffer->dwSize =0;
Buffer->dwHeadSize =0;
Buffer->lpszResponseBody =NULL;
Buffer->lpszResponseHeader =NULL;
hInternetSession = InternetOpen(
"Microsoft Internet Explorer", // agent
INTERNET_OPEN_TYPE_PRECONFIG, // access
NULL, NULL, 0); // defaults
if(hInternetSession==NULL)return 1;
int nPort=80;
DWORD Flags=INTERNET_FLAG_RELOAD;
if(!bRedirect)Flags|=INTERNET_FLAG_NO_AUTO_REDIRECT;
CString szServer;
if(strnicmp(URL,"https://",8)==0){
nPort=INTERNET_DEFAULT_HTTPS_PORT;
Flags|=INTERNET_FLAG_SECURE;
szServer=GetSubString(URL,0,"https://","/");
}
else
szServer=GetSubString(URL,0,"http://","/");
if(szServer.Find(":")!=-1){
char* szPos=strstr(szServer.GetBuffer(0),":");
nPort=atoi(szServer.Right(szServer.GetBuffer(0)-szPos+szServer.GetLength ()-1) );
szServer=szServer.Left (szPos-szServer.GetBuffer(0));
}
HINTERNET hConnect = InternetConnect (
hInternetSession, // InternetOpen handle
szServer.GetBuffer(0), // Server name
nPort,// Default HTTPS port - 443
"", // User name
"HTTP/1.0", // User password
INTERNET_SERVICE_HTTP, // Service
0, // Flags
0 // Context
);
if(hInternetSession==NULL){
InternetCloseHandle( hInternetSession);
return 1;
}
HINTERNET hReq;
CString szUrl=GetSubString(URL,0,szServer.GetBuffer (0),NULL);
if(szUrl.GetAt (0)==':'){
char* szTemp=strstr(szUrl,"/");
szUrl=szUrl.Right(szUrl.GetBuffer (0)-szTemp+szUrl.GetLength ());
}
if(Post==NULL){
hReq = HttpOpenRequest (
hConnect, // InternetConnect handle
"GET", // Method
szUrl.GetBuffer(0), // Object name
"HTTP/1.0", // Version
"", // Referrer
0, // Extra headers
Flags, // Flags
0);
}
else{
hReq = HttpOpenRequest (
hConnect, // InternetConnect handle
"POST", // Method
szUrl.GetBuffer(0), // Object name
"HTTP/1.0", // Version
"", // Referrer
NULL, // Extra headers
Flags, // Flags
0 // Context
);
}
if(hReq==NULL)
{
InternetCloseHandle( hConnect);
InternetCloseHandle( hInternetSession);

return 1;
}
BOOL bAddResult=false;
if(headers!=NULL)
bAddResult=HttpAddRequestHeaders(hReq ,headers,lstrlen(headers),HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
//retry:
BOOL bResult=HttpSendRequest( hReq,
"",
0,
(LPVOID)Post,
postLength
);
if(bResult ){
char szTempBuffer[1024];
DWORD dwSize=1024;
DWORD dwStatus=0;

// HttpQueryInfo(hReq,HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER ,&dwStatus,(LPDWORD) &dwSize, NULL);
// if(dwStatus>=500)goto retry;

HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF,
szTempBuffer ,(LPDWORD) &dwSize, NULL);
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
Buffer->lpszResponseHeader =(BYTE*) malloc( dwSize);
HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF,
Buffer->lpszResponseHeader ,(LPDWORD) &dwSize, NULL);
Buffer->dwHeadSize =dwSize;
}
else{
Buffer->lpszResponseHeader =(BYTE*) malloc( dwSize);
memcpy(Buffer->lpszResponseHeader,szTempBuffer,dwSize);
Buffer->dwHeadSize =dwSize;
}

dwSize=sizeof szTempBuffer;
bResult=HttpQueryInfo(hReq, HTTP_QUERY_CONTENT_LENGTH,
szTempBuffer ,(LPDWORD) &dwSize, NULL);
DWORD dwBufferlen;
if(bResult)
{
dwBufferlen=atol(szTempBuffer);
Buffer->lpszResponseBody=(BYTE*)malloc(dwBufferlen);
ZeroMemory(Buffer->lpszResponseBody,dwBufferlen);
Buffer->dwSize=dwBufferlen;
DWORD dwReaded=0;
DWORD dwBytesRead;
do {
bResult=InternetReadFile(hReq,
Buffer->lpszResponseBody+dwReaded,
dwBufferlen,
&dwBytesRead);
dwReaded+=dwBytesRead;
if(szErrorMsg!=NULL && stristrA((const char*)Buffer->lpszResponseBody,szErrorMsg)!=NULL)break;
if(szSuccessMsg!=NULL && stristrA((const char*)Buffer->lpszResponseBody,szSuccessMsg)!=NULL)break;
}while(bResult && dwReaded<dwBufferlen);
}
else{
BYTE szBuffer[8192];
DWORD dwBytesRead=0;
DWORD dwCount=0;
IStream* pStream=NULL;
if(FAILED(CreateStreamOnHGlobal(NULL,true,&pStream)))MessageBox(NULL,"Stream Create Failed!","Error",MB_OK);
LARGE_INTEGER iBegin={0};
pStream->Seek (iBegin,STREAM_SEEK_SET,NULL);
do {
bResult=InternetReadFile(hReq,
szBuffer,
sizeof szBuffer,
&dwBytesRead);
dwCount+=dwBytesRead;
pStream->Write (szBuffer,dwBytesRead,(DWORD*)&dwBytesRead);
if(szErrorMsg!=NULL && stristrA((const char*)szBuffer,szErrorMsg)!=NULL)break;
if(szSuccessMsg!=NULL && stristrA((const char*)szBuffer,szSuccessMsg)!=NULL)break;
}while(bResult && dwBytesRead!=0);
Buffer->lpszResponseBody=(BYTE*)malloc(dwCount);
ZeroMemory(Buffer->lpszResponseBody,dwCount);
pStream->Seek (iBegin,STREAM_SEEK_SET,NULL);
pStream->Read (Buffer->lpszResponseBody,dwCount,&dwBytesRead);
pStream->Release ();
//GetFromFile("Temp.001",(BYTE*)Buffer->lpszResponseBody,dwCount);
/* char szFile[MAX_PATH];
GetAppPath(szFile);
strcat(szFile,"Temp.001");
DeleteFile(szFile);*/
Buffer->dwSize=dwCount;
}
}
else{
InternetCloseHandle( hReq);
InternetCloseHandle( hConnect);
InternetCloseHandle( hInternetSession);
return 1;
}
InternetCloseHandle( hReq);
InternetCloseHandle( hConnect);
InternetCloseHandle( hInternetSession);
return 0;
}
部分辅助函数没有给出,请自己编写。
ALong_Yue 2002-10-29
  • 打赏
  • 举报
回复
为什么我不能下载全部文件?例如,上面说道的pdf文件,有700多k,可是只下载了3k多。
ALong_Yue 2002-10-28
  • 打赏
  • 举报
回复
我试过了,可是不能下载完整的pdf文件。请多帮忙了。
masterz 2002-10-28
  • 打赏
  • 举报
回复
#import "msxml.dll"
#import "msxml2.dll"

using namespace MSXML2;
int main(int argc, char* argv[])
{
printf("Test of XMLHTTP by masterz!\n");
CoInitialize(NULL);
try
{
IXMLHTTPRequestPtr xmlrequest;
xmlrequest.CreateInstance("Msxml2.XMLHTTP");
_variant_t varp(false);
xmlrequest->open(_bstr_t("GET"),_bstr_t("http://www.csdn.net/expert/topic/855/855052.xml?temp=.176037"),varp);
xmlrequest->send();
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
printf("%s\n",(LPCTSTR)bstrtbody);

}
catch (_com_error &e)
{
printf("Description = '%s'\n", (char*) e.Description());
}
CoUninitialize();
printf("program end\n");
return 0;
}


///////Post with XMLHTTP///////////////////////
#import "msxml.dll"
#import "msxml2.dll"
#include "Atlbase.h"
using namespace MSXML2;
int main(int argc, char* argv[])
{
printf("Test of XMLHTTP by masterz!\n");
CoInitialize(NULL);
try
{
IXMLHTTPRequestPtr xmlrequest;
//xmlrequest.CreateInstance("Msxml2.XMLHTTP");
xmlrequest.CreateInstance(__uuidof(XMLHTTP));
CComVariant vFalse(FALSE);
CComVariant vNull(NULL);
xmlrequest->open("POST",
_bstr_t("http://211.157.102.21/member/logon.asp"),vFalse,vNull,vNull);
xmlrequest->setRequestHeader("Content-Type:","application/x-www-form-urlencoded");
_bstr_t bsdata("name=xxx&pass=xxx&type=1");//use your login name and password
xmlrequest->send(_variant_t(bsdata));

BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
printf("%s\n",(LPCTSTR)bstrtbody);
//MessageBox(0,bstrtbody,"",MB_OK);

}
catch (_com_error &e)
{
printf("Description = '%s'\n", (char*) e.Description());
}
CoUninitialize();
printf("program end\n");
return 0;
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧