以下是具体的代码实现,请高手看看有没有需要改进的地方。谢谢!procedure TDownload.Execute;
var
idHTTP : TIdHTTP;
isExcetpion:Boolean;
urlindex:integer;
url1:string;
begin
urlindex:=aManager.ThisJob.iUrlIndex;
iLeft := aManager.arDLFThread[iIndex].iOffsetEnd - iThisBegin;
aManager.arThisDownloadSize[iIndex] := 0;
Repeat
begin
isExcetpion:= true;
idHTTP := TidHTTP.Create(nil);
try
iThisBegin := aManager.arDLFThread[iIndex].iOffsetBegin + aManager.arDLFThread[iIndex].iOffsetDownload;
idHTTP.HandleRedirects := True;
idHTTP.ReadTimeout := 30000;
idHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)';
idHTTP.Request.Connection:='Keep-Alive';
idHTTP.Request.ContentRangeStart := iThisBegin;
idHTTP.Request.ContentRangeEnd := aManager.arDLFThread[iIndex].iOffsetEnd;
url1:=aManager.thisJob.iUrls[urlindex];
idHTTP.DoRequest(hmGet, url1, nil, nil);
while not aManager.arStop[iIndex] and (iLeft > 0) do
if iLeft > BufferSize then
begin
idHTTP.ReadBuffer(Buffer, BufferSize);
fs.WriteBuffer(Buffer, BufferSize);
aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + BufferSize;
aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + BufferSize;
iLeft := iLeft - BufferSize;
aManager.arDLFThread[iIndex].iState := 1;
end
else
begin
idHTTP.ReadBuffer(Buffer, iLeft);
fs.WriteBuffer(Buffer, iLeft);
aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + iLeft;
aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + iLeft;
iLeft := 0;
aManager.arDLFThread[iIndex].iState := 1;
end;
isExcetpion := true;
except
isExcetpion := false;
if urlindex<aManager.ThisJob.iurlsCount-1 then
begin
urlindex:=urlindex+1;
end
else
begin
urlindex:=0;
aManager.arDLFThread[iIndex].iState := 2;
end;
end;
idHTTP.Free;
end;
until isExcetpion;
fs.Free;
aManager.arStop[iIndex] := False;
aManager.arStoped[iIndex] := True;
aManager.arDLFThread[iIndex].iState := 1;
end;
var
idHTTP : TIdHTTP;
isExcetpion:Boolean;
urlindex:integer;
url1:string;
begin
urlindex:=aManager.ThisJob.iUrlIndex;
iLeft := aManager.arDLFThread[iIndex].iOffsetEnd - iThisBegin;
aManager.arThisDownloadSize[iIndex] := 0;
Repeat
begin
isExcetpion:= true;
idHTTP := TidHTTP.Create(nil);
try
iThisBegin := aManager.arDLFThread[iIndex].iOffsetBegin + aManager.arDLFThread[iIndex].iOffsetDownload;
idHTTP.HandleRedirects := True;
idHTTP.ReadTimeout := 30000;
idHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)';
idHTTP.Request.Connection:='Keep-Alive';
idHTTP.Request.ContentRangeStart := iThisBegin;
idHTTP.Request.ContentRangeEnd := aManager.arDLFThread[iIndex].iOffsetEnd;
url1:=aManager.thisJob.iUrls[urlindex];
idHTTP.DoRequest(hmGet, url1, nil, nil);
while not aManager.arStop[iIndex] and (iLeft > 0) do
if iLeft > BufferSize then
begin
idHTTP.ReadBuffer(Buffer, BufferSize);
fs.WriteBuffer(Buffer, BufferSize);
aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + BufferSize;
aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + BufferSize;
iLeft := iLeft - BufferSize;
aManager.arDLFThread[iIndex].iState := 1;
end
else
begin
idHTTP.ReadBuffer(Buffer, iLeft);
fs.WriteBuffer(Buffer, iLeft);
aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + iLeft;
aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + iLeft;
iLeft := 0;
aManager.arDLFThread[iIndex].iState := 1;
end;
isExcetpion := true;
except
isExcetpion := false;
if urlindex<aManager.ThisJob.iurlsCount-1 then
begin
urlindex:=urlindex+1;
end
else
begin
urlindex:=0;
aManager.arDLFThread[iIndex].iState := 2;
end;
end;
idHTTP.Free;
end;
until isExcetpion;
fs.Free;
aManager.arStop[iIndex] := False;
aManager.arStoped[iIndex] := True;
aManager.arDLFThread[iIndex].iState := 1;
end;
推荐使用WinInet库,
http://www.delphi2007.net/DelphiNetwork/html/reply_2003051009102116999.html
相信对你肯定有帮助
另外,我是想基于现在的代码进行修改,必定现在大部分还是可以用的,就是有时候就会下载失败。