POSTリクエストの結果を画像として表示するにはどうすればよいですか?
質問
情報を表示するために動的に作成された画像が使用されるWebアプリケーションで作業しています。現在、このデータはGETクエリ文字列を使用して画像に送信されますが、より複雑な画像とデータを使用しているため、URL文字制限の問題が発生することが心配です。
レコードIDを画像に渡すだけでデータベースにこのクエリを実行できますが、これによりサーバーの需要が明らかに増加します。 POSTを使用して取得した画像をHTMLドキュメントに追加する方法はありますか?
解決
最終的には、データベースの検索はおそらく高速になると思います。データベースから小さな文字列(たとえば最大2000文字)を取得することは、特にページに1つ以上ある場合に、ユーザーに常に投稿させるよりも非常に高速で、おそらく高速です。
最良のオプションは、イメージを一度作成し、変更されない場合はキャッシュすることです。画像が再度要求されたら、キャッシュされているかどうかを確認し、readfile()を使用してブラウザに送信します。他の人がアクセスできないように、キャッシュされた画像をドキュメントルートの外に保存するのが好きですが、これはあなたがやっていることの要因ではないかもしれません(キャッシュとプライバシーの両方)。
SESSIONはオプションかもしれませんが、これは、わずかな変更を加えて複数のページで画像を再生成する必要がある場合に最適なオプションです。そのため、毎回dbを照会する必要はありません。
他のヒント
簡単ではありません-<!> lt; img / <!> gt;の場合のように、HTMLには複数のPOSTリクエストを送信し、結果をインラインリソースとしてレンダリングするための固有のサポートが含まれていません。 <!> lt; script / <!> gt;およびSRC属性を定義するその他のタグ。
ここでもAJAXの回避策は役に立たないかもしれません。画像のSRC属性を変更するのは簡単ですが、ブラウザが新しい画像を取得するようにするだけです(構成に応じて、キャッシュまたはサーバーから)。実際には、イメージのコンテンツをHTTP POSTからのバイナリレスポンスに変更することは、はるかに複雑です。あなたのページで。
<!> quot;クリックして画像を表示するためのフォーム<!> quot;のあるフォームをいつでも使用できます。もちろん、送信ボタンとして-フォームを送信すると、サーバーはimage / jpegデータで応答し、ブラウザはそれをスタンドアロンの画像として表示します。ただし、インラインでは実行できないと確信しています。
1つのオプションは、このデータをセッション変数に保存することです。サーバーがより適切に処理する方法を確認するために、いくつかのテストを行う必要があります
Darryl Heinのコメントを拡張するには:
これで、作業を終えたらセッションから削除することをお勧めします。常にそこにある場合、PHPは画像<!> quot; page <!> quot;だけでなく、ページ呼び出しごとにそれをロードします。 <!>#8211;ダリル・ハイン
はい、これについて考えて同意します。不要なセッションデータでチューブを詰まらせたくないのですが、データを削除するタイミングがわからない場合はどうでしょうか。画像を作成した後にセッションデータを削除することはできません。画像を2回表示する場合はどうなりますか?画像自体が一定期間キャッシュされない限り。
このようなもの
リクエストページ
<? //index.php
$_SESSION['imagedata']['header'] = array('name'=>'Simon','backgroundcolor'=>'red');
echo '<img src="image.php?image=header">';
// more stuff
echo '<img src="image.php?image=header">'; // same image
?>
画像スクリプト
<? //image.php
switch($_GET['image']){
case 'header':
if(isSet($_SESSION['imagedata']['header'])){
// create image using $_SESSION['imagedata']['header'] data
// create cached image
unset($_SESSION['imagedata']['header']);
else if(cache_file_exists()){
// display cached file
}else{
// no data, use plan B
}
break;
}
?>
画像がIDで識別できる場合は、それを使用します。同じIDが毎回同じ画像を生成する必要があると仮定すると、標準のHTTPキャッシュサポートを使用して画像を提供するプロキシを使用するだけです。
一部のシナリオおよびいくつかの制限では、画像を表示する場所でIframeを使用し、そのiframeを指すターゲット属性で投稿できます。
したがって、メインページにはiframeがあります。メインページにはIフレームをポストするフォームがあり、サーバーはiframeに表示される画像を返します。