首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用TIdHttp渐进式下载文件

使用TIdHttp渐进式下载文件
EN

Stack Overflow用户
提问于 2012-11-30 15:53:12
回答 3查看 15.4K关注 0票数 20

我想用TIdHttp (Indy10)实现一个简单的http下载器。我在网上找到了两种代码示例。不幸的是,没有一个能让我100%满意。这是代码,我需要一些建议。

变体1

代码语言:javascript
复制
var
  Buffer: TFileStream;
  HttpClient: TIdHttp;
begin
  Buffer := TFileStream.Create('somefile.exe', fmCreate or fmShareDenyWrite);
  try
    HttpClient := TIdHttp.Create(nil);
    try
      HttpClient.Get('http://somewhere.com/somefile.exe', Buffer); // wait until it is done
    finally
      HttpClient.Free;
    end;
  finally
    Buffer.Free;
  end;
end;

代码很紧凑,很容易理解。问题是它会在下载开始时分配磁盘空间。另一个问题是,我们不能在图形用户界面中直接显示下载进度,除非代码在后台线程中执行(或者我们可以绑定HttpClient.OnWork事件)。

变体2:

代码语言:javascript
复制
const
  RECV_BUFFER_SIZE = 32768;
var
  HttpClient: TIdHttp;
  FileSize: Int64;
  Buffer: TMemoryStream;
begin
  HttpClient := TIdHttp.Create(nil);
  try
    HttpClient.Head('http://somewhere.com/somefile.exe');
    FileSize := HttpClient.Response.ContentLength;

    Buffer := TMemoryStream.Create;
    try
      while Buffer.Size < FileSize do
      begin
        HttpClient.Request.ContentRangeStart := Buffer.Size;
        if Buffer.Size + RECV_BUFFER_SIZE < FileSize then
          HttpClient.Request.ContentRangeEnd := Buffer.Size + RECV_BUFFER_SIZE - 1
        else
          HttpClient.Request.ContentRangeEnd := FileSize;

        HttpClient.Get(HttpClient.URL.URI, Buffer); // wait until it is done
        Buffer.SaveToFile('somefile.exe');
      end;
    finally
      Buffer.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;

首先,我们从服务器查询文件大小,然后分块下载文件内容。检索到的文件内容将在完全接收后保存到磁盘。潜在的问题是我们必须向服务器发送多个GET请求。我不确定某些服务器(例如megaupload)是否会在特定时间段内限制请求的数量。

My expectations

  1. 下载程序应该只向服务器发送一个GET-request。
  2. 下载开始时不能分配磁盘空间。

任何提示都是值得感谢的。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13641055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档