我仿照书上的例子写了一个用WinInet HTTp下载的程序,但是总是会出现Bad Request的现象,请大家帮我看看

apache_cd apache_cd 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
void THttpFileDownload::FileDownLoad(AnsiString URL, AnsiString LocalFile)
{
int i;
AnsiString HostName,FileName;
//分解URL
i=URL.Pos("http://");
if(i>0) URL.Delete(1,7);
i=URL.Pos("/");
HostName=URL.SubString(1,i-1);
FileName=URL.SubString(i,URL.Length());
//建立会话
HINTERNET hSession=InternetOpen("IE",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL,0);
DoOnStatusText("建立会话");
//建立连接
HINTERNET hConnect=InternetConnect(hSession,
HostName.c_str(),
INTERNET_DEFAULT_HTTP_PORT,
NULL,NULL,
INTERNET_SERVICE_HTTP,0,0);
DoOnStatusText("建立连接");
//初始化下载请求
const char *Type="*/*";
HINTERNET hRequest=HttpOpenRequest(hConnect,
"GET",
FileName.c_str(),
"HTTP/1.1",
NULL,
&Type,
INTERNET_FLAG_RESYNCHRONIZE,0);
DoOnStatusText("初始化下载请求");

//发出下载请求
HttpSendRequest(hRequest,
NULL,
0,
NULL,
0);
DoOnStatusText("下载请求");
//获取要下载的文件的大小
DWORD BufferLen;
BufferLen=1024;
DWORD Index=0;
char Buffer[1025];
HttpQueryInfo(hRequest,
HTTP_QUERY_CONTENT_LENGTH,
Buffer,
&BufferLen,
&Index);
DWORD FileSize=StrToInt(Buffer);
//FileLength=FileSize;
DoOnStatusText("获取文件大小:"+IntToStr(FileSize));
//建立文件
int hFile;
DWORD Count=0;//总共下载的字节数
if(FileExists(LocalFile))
{
DoOnStatusText("续传");
hFile=FileOpen(LocalFile,fmOpenWrite);
Count=GetFileSize(HANDLE(hFile),NULL);
if(Count>0)
{
//调整本地文件指针到末尾
FileSeek(hFile,0,2);
//调整Web上的文件指针
InternetSetFilePointer(hRequest,
Count,
NULL,
FILE_BEGIN,
NULL);
}
}
else
{
hFile=FileCreate(LocalFile);
DoOnStatusText("创建文件");
}
//下载文件
DWORD Request=1024;//请求下载的字节数目
DWORD Read;//本次下载的字节数目
bool Result;
bool ReadResult;
do
{
Application->ProcessMessages();
ReadResult=InternetReadFile(hRequest,
(LPVOID)Buffer,
Request,
&Read);
if(!ReadResult) break;
if(Read==0) break;
//保存
Buffer[Read]='/0';
FileWrite(hFile,Buffer,Read);
Count=Count+Read;
// DownLength=Count;
Form1->ProgressBar1->Position=Count*100/FileSize;//调整进度条位置
}
while(!StopFlag);//检查是否应该停止下载
FileClose(hFile);
DoOnStatusText("关闭文件");
//释放资源
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
DoOnStatusText("释放资源");
//提示
if(FileSize==Count)
{
//Application->MessageBoxA("下载完毕","",MB_OK);
DoOnStatusText("下载完毕");
}
}
P.S 试验的机器是处于内网之中,通过代理连接Internet
...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部