为什么有些下载文件不知道自己的大小?

为什么有些下载文件不知道自己的大小?

有时,在网络浏览器中下载文件时,下载进度并“不知道”文件的总大小,或者下载的进度——它只显示下载速度,总速度为“未知”。

为什么浏览器不知道某些文件的最终大小?它首先从哪里获取这些信息?

答案1

要从 Web 服务器请求文档,浏览器会使用 HTTP 协议。您可能从地址栏中知道该名称(现在它可能被隐藏了,但当您单击地址栏、复制 URL 并将其粘贴到某个文本编辑器中时,您会http://在开头看到)。HTTP 是一种简单的基于文本的协议。它的工作原理如下:

首先,你的浏览器连接到网站的服务器,并发送要下载的文档的 URL(网页也是文档)以及有关浏览器本身的一些详细信息(用户代理等)。例如,为了加载 SuperUser 站点的主页,http://superuser.com/我的浏览器会发送如下请求:

GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT

第一行指定服务器应返回哪个文档。其他行称为标题;它们如下所示:

Header name: Header value

这些行发送额外的信息来帮助服务器决定做什么。

如果一切顺利,服务器将通过发送请求的文档来做出响应。响应以状态消息开始,然后是一些标题(包含有关文档的详细信息),最后,如果一切顺利,则是文档的内容。这是 SuperUser 服务器对我的请求的回复:

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672

<!DOCTYPE html>
<html>
    [...snip...]
</html>

最后一行之后,超级用户的服务器关闭连接。

第一行(HTTP/1.1 200 OK)包含响应代码,在本例中为200 OK。这意味着服务器已决定它可以按请求返回文档,并承诺后续内容将是这样的文档。如果不是这种情况,代码将是其他内容,它将提供一些指示,说明服务器不只是返回文档作为响应的原因:例如,如果它找不到请求的文档,它应该返回404 Not Found,如果您无权访问相关内容,它应该返回403 Forbidden

在第一个状态行之后,紧接着是响应标头;它们提供有关返回内容的更多信息,例如其Content-type

接下来是空行。它表示不会再有响应标头。该行后面的所有内容都是它请求的文档的内容。因此,在上面的示例中,<!DOCTYPE html>是 SuperUser 主页(HTML 文档)的第一行。如果我请求下载文档,它可能会是一些乱码,因为大多数文档格式如果不经过事先处理就无法读取。

回到标题。对我们来说最有趣的是最后一个,Content-Length。它通知浏览器在空行后应该有多少字节的数据,所以基本上它是以字节表示的文档大小。此标题不是强制性的,服务器可能会省略。有时无法预测文档大小(例如当文档是动态生成时),有时懒惰的程序员不会包含它(在驱动程序下载网站上很常见),有时网站是由不知道这种标题的新手创建的。

无论如何,无论原因是什么,标题都可能丢失。在这种情况下,浏览器不知道服务器要发送多少数据,因此将文档大小显示为未知,等待服务器关闭连接。这就是文档大小未知的原因。

答案2

在某些情况下, HTTPContent-Length标头是可选的,因此它可能不会与文件一起传输;当套接字关闭时,将发出文件结尾的信号。

答案3

当内容(例如.pdf文档或 Excel 表)是动态创建的,其大小无法事先知道。在这种情况下,服务器无法事先向您发送下载的大小,浏览器也无法显示总大小。

相关内容