web-dev-qa-db-ja.com

ダウンロードファイルの中には、なぜ自分のサイズがわからないのですか?

時折、Webブラウザでファイルをダウンロードするとき、ダウンロードの進行状況はファイルの合計サイズ、またはダウンロードがどれくらい進んでいるかを「知らない」 - それは単にそれがダウンロードしている速度を示します、 「不明」として合計。

ブラウザがいくつかのファイルの最終サイズを知らないのはなぜでしょうか。そもそもそれはどこでこの情報を得ますか?

82
Coldblackice

Webサーバーからドキュメントを要求するために、ブラウザーはHTTPプロトコルを使用します。あなたはアドレスバーからその名前を知っているかもしれません(今は隠されているかもしれませんが、アドレスバーをクリックしてURLをコピーしてテキストエディタに貼り付けると、先頭にhttp://が表示されます)。 HTTPは単純なテキストベースのプロトコルです。それはこのように動作します:

まず、ブラウザーはWebサイトのサーバーに接続し、ダウンロードするドキュメントのURL(Webページもドキュメントです)とブラウザー自体に関する詳細を送信します( ser-Agent など)。たとえば、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>

最後の行の後、SuperUserのサーバーは接続を閉じます。

最初の行(HTTP/1.1 200 OK)には 応答コード が含まれ、この場合は200 OKです。これは、サーバーが要求に応じてドキュメントを返すことができると判断したことを意味し、後続のコンテンツがそのようなドキュメントになることを約束します。そうでない場合、コードは別のものになり、サーバーが応答としてドキュメントを返すだけではない理由を示す指標を提供します。たとえば、要求されたドキュメントが見つからない場合は、 404 Not Found。問題のコンテンツへのアクセスが許可されていない場合は、403 Forbiddenを返すことになっています。

この最初のステータス行の後に、応答ヘッダーが続きます。 Content-typeなど、返されるコンテンツに関する詳細情報を提供します。

次は空の行です。これは、応答ヘッダーがこれ以上続かないという事実を示します。その行を超えるものはすべて、要求したドキュメントのコンテンツです。したがって、上記の例では、<!DOCTYPE html>はSuperUserホームページ(HTMLドキュメント)の最初の行です。ダウンロードするドキュメントをリクエストしていた場合、ほとんどのドキュメント形式は事前の処理なしでは読み込めないため、おそらく意味不明な文字になるでしょう。

ヘッダーに戻ります。私たちにとって最も興味深いのは、最後のContent-Lengthです。それは、空行の後に何バイトのデータが必要かをブラウザに通知するため、基本的にはバイト単位で表されるドキュメントサイズです。このヘッダーは必須ではなく、サーバーによって省略される場合があります。ドキュメントのサイズを予測できない場合(たとえば、ドキュメントがオンザフライで生成される場合)、怠laなプログラマーがドキュメントのサイズを含めない場合(ドライバーのダウンロードサイトで非常に一般的)、Webサイトが知らない初心者によって作成される場合がありますそのようなヘッダーの。

とにかく、理由が何であれ、ヘッダーが欠落している可能性があります。その場合、ブラウザはサーバーが送信するデータ量を知らないため、ドキュメントサイズをunknownとして表示し、サーバーを待機します接続を閉じます。そして、それが未知の文書サイズの理由です。

114
gronostaj

HTTPのContent-Lengthヘッダーはオプションの場合があります。そのため、ファイルとともに送信されない場合があります。ソケットが閉じられるとファイルの終わりが通知されます。

コンテンツ(例:.pdf文書またはExcelシート)がその場で作成された場合、サイズは以前にはわかりません。この場合、サーバーは以前にダウンロードのサイズを送信することができず、ブラウザは合計サイズを表示できません。

3
Uwe Plonus