ユーザーに表示する前に画像をプリロードすることに大きく依存する Web アプリケーションを開発しています。ただし、ユーザーのアクションによっては、帯域幅を浪費しないように、ファイナライズする前にイメージの読み込みを終了することが重要な場合があります。これを行うことは可能ですか?もしそうなら、どのように正確ですか?
3 に答える
はい、HTTP ストリーミングと特別な AJAX メソッドを使用してこれを実現できます。
サーバー上の各画像を base64 文字列にエンコードします。注: これにより、ペイロード サイズが最大 33% 増加します。PHPの場合、base64_encode
関数を見てください
base64 でエンコードされた文字列をnバイト サイズのチャンクに分割します。各チャンクを出力し、毎回出力バッファをフラッシュします。flush
php.netのコメント セクションにいくつかのヒントがあります。
AJAX 呼び出しの実装方法によっては、XMLHttpRequest を中止して、ブラウザーに接続を強制的に閉じることができます。永続的なチェック方法の詳細は 次のとおりですhttp://ajaxpatterns.org/HTTP_Streaming#Streaming_Wiki_Demo
ajax 呼び出しが完了し、すべてのデータがダウンロードされたら、データ URL を使用してブラウザーで画像を作成するだけです。data:image/png;base64,ENCODED_DATA
このhttp://ajaxpatterns.org/archive/HTTP_Streaming.phpもご覧ください。
事前にロードするように要求したイメージを停止することはできないと思います。
いずれにせよ、画像が要求された後に接続を終了しようとしても、クライアントがそれを受け入れなくても、サーバーがデータ転送を完了する可能性が非常に高くなります (つまり、帯域幅はまだ浪費されています)。
あなたができる最善のことは、javascriptを使用して一度に1つずつ画像をプリロードすることです. そうすれば、画像の読み込みを停止したい場合、現在読み込み中の画像を停止できなくても、残りの画像のプリロードを停止できます。
jQuery を使用している場合は、AJAX リクエストを中止してみてください。
jQuery.ajax() 関数を使用して画像をプリロードします。XMLHttpRequest オブジェクトには、呼び出すことができる abort() メソッドがあります。
ただし、これは実際には文書化されていません。ajax() 関数は、画像をロードするようには設計されていません。この関数から得られる画像は、使用できない奇妙なバイナリになります。(画像フォーマットがサポートされていないため、テキストとして解釈されます)
ただし、ブラウザが本来の処理を行っていると仮定すると、画像がキャッシュされる可能性があります。キャッシュされている場合は事前に読み込まれ、同じ URL を参照するだけで使用できます。
キャッシュは、キャッシュの有効期限が切れるまでの画像の有効期間に関して、サーバーから返されるヘッダーの影響を大きく受けます。
私は、 Javascriptに関する問題に対して受け入れ可能な (多かれ少なかれ) 解決策を見つけました: Cancel/Stop Image Requestsを次のように適用しました。
var img = new Image();
img.src = "IMG_0111.JPG";
var timer = setTimeout(function(){
window.stop();
document.execCommand("Stop", false);
},50);
これにより、探していた結果が得られますが、他のすべての HTTP 要求も終了してしまうのではないかと心配しています。