当HEAD请求未报告ContentLength时,如何获得下载大小?

Sky*_*Sky 3 delphi size

在Delphi中使用此代码获取网页大小:(我的意思是页面源大小)

uses
  IdHTTP

function URLsize(const URL : string) : integer;
var
  Http: TIdHTTP;
begin
  Http := TIdHTTP.Create(nil);
  try
    Http.Head(URL);    
    result := round(Http.Response.ContentLength / 1048576);   //MB   
  finally
    Http.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我可以轻松获取某些URL的文件大小http://sample.com/test.exe.它以MB为单位返回大小.

但我无法使用此代码获取URL大小的URL http://stackoverflow.com/; 它返回0-1.

在这种情况下如何获得尺寸?

Dav*_*nan 8

并非所有HTTP HEAD响应都包含内容长度.所以,一般来说,你想做的事情是不可能的.如果您遇到不包含内容长度的响应,则需要下载内容以查找长度.

  • @Sky:大卫是对的.并非所有`HEAD`请求(或者'GET`请求)都可以提供`Content-Length`标头(`TIdHTTP.Response.HasContentLength`属性将告诉您标头是否存在).这是在不下载实际文件的情况下获取文件大小的官方方法.如果下载管理器能够获得大小而您不是,那么经理就依赖于其他信息.您将不得不查看实际的`HEAD`响应,以查看报告的其他数据.但是`http:// stackoverflow.com /`确实有一个`Content-Length`标题. (7认同)
  • 如果stackoverflow.com确实为HEAD提供内容长度,那么Indy肯定会传递它. (2认同)
  • 如果存在`Content-Length`标题,Indy确实会提供它.StackOverflow(和其他服务器)如​​果能够预先知道实际文件总大小,即使是动态创建的内容,也可以提供`Content-Length`标头.它是在创建内容时发送的,例如使用`Transfer-Encoding:chunked`标头,其中`Content-Length`不存在,因为在请求结束之前大小是未知的,或者它存在但是0(即使它不应该出现,但有些服务器会这样做). (2认同)
  • 再说一次,如果DM正在获取文件大小而您不是,那么DM必须查看其他内容,因此您需要查看完整响应以查看您可以查看的其他内容. (2认同)