ファイルのダウンロードはWEBサイトが提供する最も基本的なサービスですが、HTTPレジュームダウンロードはどのように実装されているかご存知ですか?
背景
過去 2 日間、HTML5 に基づいたオンライン オーディオとビデオの再生を実装してきました。ファイルは企業ネットワーク ディスクに保存されており、HTTP ではアクセスできないため、ファイルを読み取るプログラムが必要です。 HTTP プロトコルをダウンロードします。言うまでもなく、Java を使用してファイルをダウンロードすることは、単にファイルを読み取り、バイナリ ストリームを通じて応答に書き込むだけです。 H5 プレーヤー コールも再生できますが、前後の進行を制御すると問題が発生し、まったく効果がありません。早送りプレーヤーがない場合でもプレーヤーと呼ばれますか?
分析
まず、プレーヤーがオーディオファイルとビデオファイルの時間の長さを取得できないことを見ると、バックグラウンドがファイルを通じてファイルの長さを取得していると考えるのが自然です。 .length() を呼び出して Content-Length に設定します (コードは次のとおりです)。オーディオとビデオの長さをフォアグラウンド プレーヤーに表示でき、早送りできます。ただし、巻き戻すと、まだ無効であり、バックグラウンドでエラーが報告されます。
りー比較テストのために HTTP ファイルを変更したところ、HTTP への直接アクセスで通常どおり早送りや巻き戻しができることがわかりました。 2 つのリクエスト ヘッダーとレスポンス ヘッダーを注意深く分析した結果、リクエスト パラメーターの違いがわかりました。 以下の図に示すように、さらに多くの属性があります。属性テーブル名は、デフォルトでは、最初のバイトから開始され、指定することで予想される開始点が決まります。範囲属性。
しかし、この属性はリクエストヘッダーにあります。クライアントはこの属性を追加することをどのようにして知るのでしょうか?検索を続けると、Accept-Ranges 属性が見つかりました。属性値はバイトであり、エンティティの一部 (ファイルの一部など) を取得する要求を受け入れるかどうかを示します。バイト: 受け入れを示し、なし: 受け入れられないことを示します。対応する応答には、Content-Range という別の属性があり、応答に含まれる部分オブジェクトがオブジェクト全体のどの部分であるかを示します。完全な応答ヘッダーは次のとおりです。
解決策
上記の分析に基づいて、サーバー側でそれを処理する方法がわかります。まず、応答ヘッダーに Accept-Ranges を追加します。
response.addHeader("Content-Length", file.length());
次に、リクエストに Range 属性が存在するかどうか、つまり指定された開始点が存在するかどうかを判断し、存在する場合はストリームのスキップによって目的の開始点に直接ジャンプし、最後に Content-Range 属性を追加します。テーブル名を現在のブロックの先頭と末尾に追加し、コードを完成させると次のようになります:
response.setHeader("Accept-Ranges", "bytes");