如何在名为Content-Length的HTTP标头上找到文件的下载大小?

时间:2016-10-26 23:56:17

标签: php html http header

该问题还要求我们找到URL的总下载大小。但是,如果传入脚本的URL只指向单个文件资源(如JPG文件或GIF文件),该怎么办?好吧,对于单个文件资源,我们只需要找到该特定文件的大小,然后将其作为答案返回,我们就完成了。但是,对于HTML文档,我们需要找到嵌入并包含在页面中的所有资源的总大小,并将其作为答案返回

function get_remote_file_size($url) {

    $headers = get_headers($url, 1);

    if (isset($headers['Content-Length'])) 

        //checks for lower case "L" in Content-length:
    if (isset($headers['Content-length'])) 
           return $headers['Content-length'];    

}

2 个答案:

答案 0 :(得分:2)

这实际上是一个非常复杂的问题,而且没有明确的答案。你需要查阅很多东西,所以我会引导你完成这些步骤。

  1. 下载原始页面HTML。
  2. 使用DOM解析器将HTML实际解析为元素图。
  3. 遍历每个元素,并下载您关心的所有外部资源。这将是src<img><video><script>等的<iframe>属性。不要忘记CSS {{1} }}。
  4. 但这并不是万能的。你现在有了一个新问题。如果JavaScript加载更多脚本怎么办?也许它通过AJAX添加数据?也许CSS引用了一些图形或其他CSS?也许嵌入字体?

    更糟糕的是,有时这些东西都是定时的。有时,脚本不会加载某些东西,直到有用户交互,或者在加载几秒钟之后。

    最重要的是,不要忘记加载的每件新物品都可以带来自己的东西。 (例如广告通常会加载几个东西。)

    您可以做的最好的事情是使用像PhantomJS这样的无头浏览器,加载页面并让脚本运行,并跟踪下载的所有资源。然后,等待几秒钟(或者如果您愿意,可以直到页面加载为止),并将其添加。但是,在页面完成时,没有万无一失的确定时间。

答案 1 :(得分:-3)

get_headers函数接受一个URL作为参数。因此,用于检索“Content-Length”标头的PHP代码将如下所示

function get_remote_file_size($url) {

$headers = get_headers($url, 1);

if (isset($headers['Content-Length'])) 
       return $headers['Content-Length'];

    //checks for lower case "L" in Content-length:
if (isset($headers['Content-length'])) 
       return $headers['Content-length'];


}