在下载之前,使用delphi以编程方式从远程文件中获取文件大小

时间:2010-02-02 12:39:42

标签: delphi

如何使用Delphi在下载之前确定Web中托管的远程文件的大小(以字节为单位)?

提前致谢。

3 个答案:

答案 0 :(得分:11)

你可以使用Indy。

首先包括IdHTTP

您可以通过这种方式检索尺寸:

procedure TFormMain.Button1Click(Sender: TObject);
var
  Http: TIdHTTP;
begin
  Http := TIdHTTP.Create(nil);
  try
    Http.Head('http://live.sysinternals.com/ADExplorer.exe');

    ShowMessage(IntToStr(Http.Response.ContentLength));
  finally
    Http.Free;
  end;
end;

答案 1 :(得分:10)

简答:使用Indid Delphi的TIdHttp组件中提供的HTTP HEAD命令。

详细说明:

HTTP协议定义了HEAD方法。

  

9.4 HEAD

     

HEAD方法与GET相同   除了服务器不能返回   响应中的消息正文。该   HTTP中包含的元信息   响应HEAD请求的标头   应该与信息完全相同   发送以响应GET请求。   该方法可用于获得   关于实体的元信息   没有提出要求所暗示的   转移实体 - 身体本身。   此方法通常用于测试   有效性的超文本链接,   可访问性,最近   修改

     

对HEAD请求的响应可能是   可缓存的意思是   回复中包含的信息   可以用来更新以前的   来自该资源的缓存实体。如果   新的字段值表明了   缓存实体与当前不同   实体(由a表示)   Content-Length,Content-MD5的变化,   ETag或Last-Modified),然后是缓存   必须将缓存条目视为陈旧。

HEAD要求响应与对应于GET请求的响应相同,但没有响应主体,检索完整的响应头,而不是整个内容。

检索到的HTTP响应标头记录在Wikipedia上的 HTTP标头列表中。 http://en.wikipedia.org/wiki/List_of_HTTP_headers

  

HTTP标头构成HTTP请求的核心,   并且在HTTP响应中非常重要。   它们定义了数据的各种特征   请求的内容或已提供的数据。   标头与请求或分开   通过空白行回应身体。 HTTP标头   可以是几乎任意的字符串,但只有一些   通常被理解。

有效URL检索内容时始终存在的标头之一是 Content-Length标题。

  

14.13内容长度

     

Content-Length实体标题字段表示   实体主体的大小,以十进制数字表示的OCTET,   发送给收件人,或者在HEAD方法的情况下,   已发送的实体主体的大小   请求是GET。

     

Content-Length = "Content-Length" ":" 1*DIGIT

     

一个例子是

     

Content-Length: 3495

     

应用程序应该使用此字段来指示   传递长度的消息体,除非这是   4.4节中的规则禁止。

     

任何大于或等于零的Content-Length都是a   有效价值。第4.4节描述了如何确定   如果没有给出Content-Length,则为message-body的长度。

     

请注意,此字段的含义非常明显   与MIME中的相应定义不同,   其中是一个可选字段   “message / external-body”内容类型。在HTTP中,   它应该在消息长度时发送   可以在转移前确定,   除非第4.4节中的规则禁止这样做。

从Delphi中,将TIdHttp组件拖放到表单中。并将以下代码粘贴到您的一个delphi事件处理方法中。

var 
  url: string;  // must contain a fully qualified url
  contentLength: integer;
begin
  ....
  contentLength:=0;
  try
    Idhttp1.Head(url);
    contentLength:=idhttp1.response.ContentLength;
  except end;
  ....

答案 2 :(得分:3)

请注意,并非所有服务器都会为头部请求返回有效的内容大小。如果内容长度= 0,那么您只会知道是否发出GET请求。例如,针对Google logo的HEAD请求返回0内容长度,但是GET返回正确的长度,但也检索图像。某些服务器将返回内容长度作为标头后面的数据包长度。

您也可以使用Synapse获取此信息。请注意,数据已传输,但缓冲区被丢弃。这是一种更可靠的方法,但需要额外的带宽。

var
  HTTP : tHTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.HTTPMethod('GET',url);
    DownloadSize := HTTP.DownloadSize;
  finally
    HTTP.Free;
  end;
end;