いくつかのダウンロードファイルが自分のサイズを知らないのはなぜですか?[複製]


82

この質問にはすでに答えがあります:

Webブラウザでファイルをダウンロードするとき、ダウンロードの進行状況がファイルの合計サイズやダウンロードの進行状況を「認識」しない場合があります。ダウンロードの速度を示すだけです。 「不明」として合計します。

ブラウザがいくつかのファイルの最終サイズを知らないのはなぜですか?そもそもこの情報はどこで入手できますか?


13
動的に作成されたファイルにはサイズがなく、EOFに達するまでストリームとして送信されます。
フィアスコラボ

回答:


114

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

まず、ブラウザーはWebサイトのサーバーに接続し、ダウンロードするドキュメントのURL(Webページもドキュメント)とブラウザー自体に関する詳細(ユーザーエージェントなど)を送信します。たとえば、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。これは、空の行の後に何バイトのデータが必要かをブラウザに通知するため、基本的にはバイト単位で表されるドキュメントサイズです。このヘッダーは必須ではなく、サーバーによって省略される場合があります。ドキュメントサイズを予測できない場合(たとえば、ドキュメントがその場で生成される場合)、怠sometimesなプログラマーがドキュメントサイズを含めない場合(ドライバーのダウンロードサイトで非常に一般的)、Webサイトが知らない初心者によって作成される場合がありますそのようなヘッダーの。

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


4
非常に小さなメモ:ブラウザはHTTP以外のプロトコルをサポートします。しかし、最近では他のプロトコルはまれであり、細部が異なっていても本質的に同じ概念が他のプロトコルに適用されます。
ロバートフィッシャー

5
@RobertFisher FTPは珍しいプロトコルですか?:p
トーマス

5
@Thomasそれは最近の私の経験です。ブラウザでftp URLを見たのを覚えてから数年が経ちました。数年前、私はftpを(ブラウザではなく直接)職場で使用していました(ほぼ完全にアップロード)が、これらのタスクは現在scpによって処理されています。今日私がftpを使用するのは、最小限のWebホストにコンテンツをアップロードすることだけです。もちろん、YMMV。^ _ ^
ロバートフィッシャー

2
これはまさにこのサイトを気に入ってくれるような答えです。報奨金を付与するにはどうすればよいですか?
そのブラジル人

1
あなたの@ ruda.almeidaはそれに反対します。meta.superuser.comでそれについて投稿できます。議論され、誰かが質問を再開するかもしれません。
グローノスタジ

54

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


1
正確には、HTTP 1.0は各ドキュメントの後にソケットを閉じることでコンテンツの長さを定義しました。これは、互換性のためにHTTP 1.1でも引き続きサポートされています。しかし、HTTP 1.1では、Content-Lengthヘッダーフィールドが使用されるか、ドキュメントがで転送される場合、複数のドキュメントの接続を再利用できますTransfer-Encoding: chunked。後者は、コンテンツを動的に生成し、生成されたとおりにピース単位で送信し、ドキュメントの終わりを知らせることができます。
-x4u

3

コンテンツ(.pdfドキュメントやExcelシートなど)をその場で作成する場合、サイズを知ることはできません。この場合、サーバーは以前にダウンロードのサイズを送信できず、ブラウザは合計サイズを表示できません。


9
@alfoは同意しなければなりません...ビデオをストリーミングしている場合、または固定サイズではない種類のデータをストリーミングしている場合でも、ポイントができるだけ早くユーザーにデータを取得することである場合、転送を開始した時点でサイズがわかりません
Foon

4
@Alfo .pdfファイルのようなデータをその場で作成できます。データが完全に書き込まれていない限り、サイズはわかりませんが、すでにブラウザにataを送信できます。私はすでにJavaでこれを行っており、Excelファイルをブラウザに送信しました。このファイルはその場で生成されました。ブラウザ側からはダウンロードのように見えましたが、サーバー側からはストリーミングです。したがって、これを想像しなくてもファイルをストリーミング .pdfすることが可能です。ブラウザからは、長さがわからないダウンロードのように見えます。
ウーウェプロナス

8
@Alfo-最後のパケットがクライアントに送信される前に作成が完了する必要があるだけです。
ギャラクティック

4
@Alfo ビデオスチーミングについては一度も聞いたことがないが、ストリーミング全般については、.pdfファイルやExcelシートをストリーミングすることもできます。
ウーヴェプロナス

2
@Alfo-有効なポイントがあります。動的ファイルは最初にメモリ内で完全に作成され、次にHTTP経由で送信され、コンテンツの長さを簡単に計算できます。ただし、サーバーが多くのパケットに分割される多数の大きな動的に作成されたファイルを送信している場合、サーバーは計算されたチャンクの送信を開始するのが理にかなっています(メモリにすべての大きなファイルを作成してからそれを送る)。HTTP 1.1は、この目的のためにチャンク転送エンコードを特別に設計しました。
ジンボブ博士13
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.