如何使用Delphi在下载之前确定Web中托管的远程文件的大小(以字节为单位)?
提前致谢。
答案 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;