首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-03-11 
请教关于IdHTTP控件断点下载的问题下载主函数procedure TForm1.HttpDownLoad(aURL, aFile: string bResum

请教关于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,下载前则不会调整大小

热点排行