读书人

请问关于IdHTTP控件断点下载的有关问题

发布时间: 2012-03-11 18:15:39 作者: rapoo

请教关于IdHTTP控件断点下载的问题
下载主函数
procedure TForm1.HttpDownLoad(aURL, aFile: string; bResume: Boolean);
var
tStream: TFileStream;
begin //Http方式下载
if FileExists(aFile) then //如果文件已经存在
tStream := TFileStream.Create(aFile, fmOpenWrite) else
tStream := TFileStream.Create(aFile, fmCreate);

if bResume then //续传方式
begin
IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
tStream.Position := tStream.Size - 1; //移动到最后继续下载
IdHTTP1.Head(aURL);
IdHTTP1.Request.ContentRangeEnd := IdHTTP1.Response.ContentLength;
end else //覆盖或新建方式
begin
IdHTTP1.Request.ContentRangeStart := 0;
end;

try
IdHTTP1.Get(aURL, tStream); //开始下载
finally
tStream.Free;
end;
end;

暂停按钮
procedure TForm1.Button2Click(Sender: TObject);
begin
AbortTransfer := True;
end;

当点击暂停按钮后,再点击下载,能够实现文件的断点下载,一切功能正常
但是当我直接结束程序后,虽然文件还没有下载完,但是已经下载文件的大小和实际大小一样,再点击下载,文件的大小就是实际大小的两倍了,有没有什么其它的解决办法

[解决办法]
如果是续传的话用一个数据块保存文件的大小,这样就不至于再create一个同样大小的流了
[解决办法]
IdHTTP1.Get(aURL, tStream); 在执行DoRequest时都会调整文件大小为Response.ContentLength; 可以用个来log文件来记录当前的下载位置,或者将文件分块,用个循环每次都get,ContentRangeStart 到ContentRangeEnd之间的内容存到内存再自己写到文件。ftp是用InternalGet,下载前则不会调整大小

读书人网 >.NET

热点推荐