この質問にはすでに答えがあります:
Webブラウザでファイルをダウンロードするとき、ダウンロードの進行状況がファイルの合計サイズやダウンロードの進行状況を「認識」しない場合があります。ダウンロードの速度を示すだけです。 「不明」として合計します。
ブラウザがいくつかのファイルの最終サイズを知らないのはなぜですか?そもそもこの情報はどこで入手できますか?
この質問にはすでに答えがあります:
Webブラウザでファイルをダウンロードするとき、ダウンロードの進行状況がファイルの合計サイズやダウンロードの進行状況を「認識」しない場合があります。ダウンロードの速度を示すだけです。 「不明」として合計します。
ブラウザがいくつかのファイルの最終サイズを知らないのはなぜですか?そもそもこの情報はどこで入手できますか?
回答:
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として表示され、サーバーが接続を閉じるのを待機します。そして、それが未知の文書サイズの理由です。
HTTP Content-Length
ヘッダーは場合によってはオプションであるため、ファイルとともに送信されない場合があります。ソケットが閉じられると、ファイルの終わりが通知されます。
Content-Length
ヘッダーフィールドが使用されるか、ドキュメントがで転送される場合、複数のドキュメントの接続を再利用できますTransfer-Encoding: chunked
。後者は、コンテンツを動的に生成し、生成されたとおりにピース単位で送信し、ドキュメントの終わりを知らせることができます。
コンテンツ(.pdf
ドキュメントやExcelシートなど)をその場で作成する場合、サイズを知ることはできません。この場合、サーバーは以前にダウンロードのサイズを送信できず、ブラウザは合計サイズを表示できません。
.pdf
ファイルのようなデータをその場で作成できます。データが完全に書き込まれていない限り、サイズはわかりませんが、すでにブラウザにataを送信できます。私はすでにJavaでこれを行っており、Excelファイルをブラウザに送信しました。このファイルはその場で生成されました。ブラウザ側からはダウンロードのように見えましたが、サーバー側からはストリーミングです。したがって、これを想像しなくてもファイルをストリーミング .pdf
することが可能です。ブラウザからは、長さがわからないダウンロードのように見えます。
.pdf
ファイルやExcelシートをストリーミングすることもできます。