中国开发网: 论坛: 程序员情感CBD: 贴子 211873
Apache
请大牛帮助挑错。
返回的文件内容总是:BAD Request ,这是为嘛啊?




void __fastcall THttpGetThread::Execute()
{
int FrepeatCount=5;
for(int i=0;i<=FrepeatCount;i++)
{
StartHttpGet();
GetWEBFileSize();
DoHttpGet();
EndHttpGet();
if(Fsuccess)
{
break;
}
}
// 发出下载完成事件
if(Fsuccess==true)
{
DoOnComplete();
}
else
{ DoOnError();
}

//---- Place thread code here ----
}
//---------------------------------------------------------------------------
void THttpGetThread::StartHttpGet(void)
{
AnsiString HostName,FileName;
ParseURL(HostName, FileName);
try
{





// 1.建立会话
FhSession = InternetOpen("easylf",
INTERNET_OPEN_TYPE_DIRECT, //设置自动方式打开连接。
NULL,NULL,0); // 同步方式



if( FhSession==NULL)
throw(Exception("Error:InterOpen"));
DoOnStatusText("ok:InterOpen");
// 2.建立连接
FhConnect=InternetConnect(FhSession,
HostName.c_str(),
INTERNET_DEFAULT_HTTP_PORT,
NULL,NULL,
INTERNET_SERVICE_HTTP, 0, 0);

if(FhConnect==NULL)
throw(Exception("Error:InternetConnect"));
DoOnStatusText("ok:InternetConnect");
// 3.初始化下载请求
const char *FAcceptTypes = "*/*";
FhRequest = HttpOpenRequest(FhConnect,
"GET", // 从服务器获取数据
FileName.c_str(), // 想读取的文件的名称
"HTTP/1.1", // 使用的协议
NULL,
&FAcceptTypes,
INTERNET_FLAG_RELOAD,
0);

if( FhRequest==NULL)
throw(Exception("Error:HttpOpenRequest"));
DoOnStatusText("ok:HttpOpenRequest");
// 4.发送下载请求
HttpSendRequest(FhRequest, NULL, 0, NULL, 0);
DoOnStatusText("ok:HttpSendRequest");
}
catch(Exception &exception)
{
EndHttpGet(); // 关闭连接,释放资源
DoOnStatusText(exception.Message);
}
}
void THttpGetThread::ParseURL(AnsiString &HostName,AnsiString &FileName)
{
AnsiString URL=FURL;
int 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());

Form1->Memo1->Lines->Add("Host:"+HostName);
Form1->Memo1->Lines->Add("FileName:"+FileName);
}
int __fastcall THttpGetThread::GetWEBFileSize(void)
{
int FileSize;
try
{
DWORD BufLen=HTTPGET_BUFFER_MAX;
DWORD dwIndex=0;
bool RetQueryInfo=HttpQueryInfo(FhRequest,
HTTP_QUERY_CONTENT_LENGTH,
Buffer, &BufLen,
&dwIndex);
if( RetQueryInfo==false)
{

throw(Exception("Error:HttpQueryInfo"));
}
DoOnStatusText("ok:HttpQueryInfo");
FileSize=StrToInt(Buffer); // 文件大小
DoOnGetFileSize(FileSize);
}
catch(Exception &exception)
{
DoOnStatusText(exception.Message);
}
return FileSize;
}
DWORD THttpGetThread::OpenOutFile(void)
{
try
{
if(FileExists(FOutFileName))
DeleteFile(FOutFileName);
iFileHandle=FileCreate(FOutFileName);
if(iFileHandle==-1)
throw(Exception("Error:FileCreate"));
DoOnStatusText("ok:CreateFile");
}
catch(Exception &exception)
{
DoOnStatusText(exception.Message);
}
return 0;
}
// 执行下载过程
void THttpGetThread::DoHttpGet(void)
{
DWORD dwCount=OpenOutFile();
try
{
// 发出开始下载事件
DoOnStatusText("StartGet:InternetReadFile");
// 读取数据
DWORD dwRequest; // 请求下载的字节数
DWORD dwRead; // 实际读出的字节数
dwRequest=HTTPGET_BUFFER_MAX;
while(true)
{
Application->ProcessMessages();
bool ReadReturn = InternetReadFile(FhRequest,
(LPVOID)Buffer,
dwRequest,
&dwRead);
if(!ReadReturn)
break;
if(dwRead==0)
break;
// 保存数据
Buffer[dwRead]='\0';
FileWrite(iFileHandle, Buffer, dwRead);
dwCount = dwCount + dwRead;
// 发出下载进程事件
DoOnProgress(dwCount);
}
Fsuccess=true;
}
catch(Exception &exception)
{
Fsuccess=false;
DoOnStatusText(exception.Message);
}
FileClose(iFileHandle);
DoOnStatusText("End:InternetReadFile");
}

void THttpGetThread::EndHttpGet(void)
{
if(FConnected)
{
DoOnStatusText("Closing:InternetConnect");
try
{
InternetCloseHandle(FhRequest);
InternetCloseHandle(FhConnect);
InternetCloseHandle(FhSession);
}
catch(...)
{}
FhSession=NULL;
FhConnect=NULL;
FhRequest=NULL;
FConnected=false;
DoOnStatusText("Closed:InternetConnect");
}
}
void THttpGetThread::DoOnStatusText(AnsiString Str)
{
Form1->Memo1->Lines->Add(Str);
}
void THttpGetThread::DoOnGetFileSize(int size)
{
Form1->ProgressBar1->Max=size;
Form1->Memo1->Lines->Add("Size:"+IntToStr(size));

}
void THttpGetThread::DoOnProgress(int Count)
{
Form1->ProgressBar1->Position=Count;
Form1->Memo1->Lines->Add("Downloaded:"+IntToStr(Count));
}
void THttpGetThread::DoOnComplete()
{
Form1->Memo1->Lines->Add("下载完成");
}
void THttpGetThread::DoOnError()
{
Form1->Memo1->Lines->Add("下载失败");











相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录