2

PHP を介してオンザフライで画像を生成し、それらを一時ディレクトリに保存して、smartyテンプレートで表示しています。smartyで画像を表示した後、画像を自動で削除したい。
スマートに表示する前に画像を削除し、バッファなどを使用してページに画像を表示することは可能ですか?

私の問題は、Web サービスから画像 (文字列形式) を取得することです。次に、文字列を PNG 画像に変換して一時的に保存します。画像を smarty 変数に割り当てると、テンプレートが画像を表示します。base64 形式の制限は、'Tikiwiki' cms を使用していることです。CKeditor に含まれているモジュールを作成しました。Tikiwik の Ckeditor は、イメージ ソース内の長い base64 文字列が気に入らず、すべてのページ ソースを破損します (理解していただければ幸いです)。
smarty で表示した後、画像を削除できますか?

4

5 に答える 5

3

画像を 1 回しか表示しない場合は、URL の代わりに HTML のインライン データとしてブラウザに送信できます。

データ疑似 URL スキームを使用する必要があります: http://en.wikipedia.org/wiki/Data_URI_scheme

画像データ自体は base 64 でエンコードする必要があります。このような:

<img src="data:image/jpeg;base64,<?= base64_encode(file_get_contents('my_image.jpg')) ?>" />

画像データを文字列に読み取ったらすぐに、それを削除できます。さらに良いのは、最初からディスクに書き込まないことです。

于 2012-06-01T12:05:55.347 に答える
1

ある種のコントローラーで画像を生成していると思います。これにより、画像の URL が Smarty テンプレートに入れられます。次に、テンプレートがレンダリングされてブラウザーに送信されます。その後、ブラウザーは HTML ページにある URL によって生成された画像を要求します。

ここで、ディスク容量を確保するために、ブラウザに送信された後に画像を削除する必要があります。

時間の経過とともに一時ディレクトリがイメージでいっぱいになる可能性があります。毎回きれいにしなければなりません。

イメージの生成は CPU を大量に消費するプロセスであるため、生成後にリソースを削除することは適切な解決策ではありません。

ここで行う唯一の賢明なことは、単にディスク容量を増やすことです。データを生成するサイトに多くのユーザーがいると、より多くの容量が必要になります。

geonで提案されているように画像をインライン化することは、やや悪いオプションですが、「制限」のためにbase64を使用できないと言います。それはどのような制限ですか?ただし、すべてのリクエストにより、画像が再度生成されます。

ディスク容量を追加することができず、イメージに短時間だけアクセスする必要がある場合cronは、一定時間以上アクセスされていないイメージを削除するジョブを作成できます。

于 2012-06-01T13:07:39.143 に答える
1

phpファイル(例:image.php?imageid=111)を介して画像を表示し、「画像ファイル」データを読み込んでみてください。

ここにjpeg画像の例があります

header ('Content-length: ' .filesize($image_file));
header ('Content-type: image/jpeg');
readfile ($image_file);
unlink($image_file);
die();
于 2012-06-01T11:59:48.450 に答える
1

あなたが話しているようにそれを行うことは不可能だと思いますが、このようにすることはできます.

実際の画像を参照するのではなく、次のコードを配置したプロキシ ページを参照してください。

$imageUrl = "/images/123.jpg"; // link to image
$imginfo = getimagesize($imageUrl); // get mime info

header("Content-type: " . $imginfo['mime']); // add Content-type header

readfile($imageUrl); // show image

unlink($imageUrl); // delete image
于 2012-06-01T12:01:11.823 に答える
0

問題は、画像が実際に表示されることを保証できないことです ( data:@geon が提案する URI アプローチを使用しない限り)。これは、作成したクライアントだけが実際に画像を表示するかどうかはわかりません。

ただし、一種のハックな回避策があります。画像とランダムなハッシュの間のリンクをユーザーのセッションに保存し、このハッシュが URL にある場合は画像を配信 (および削除) します。

if (isset($_GET['_imagelink'])) {
    if (isset($_SESSION[$_GET['_imagelink']])) {
        $path = $_SESSION[$_GET['_imagelink']];
        if (is_file($path)) {
            readfile($path);
            unlink($path);
        }
    }
}

前のリクエストの Smarty テンプレートでは、secret 変数を知っていて_imagelink、URL を でエコーするだけで済みます?_imagelink={$_imagelink}

欠点は、一時フォルダーを時々手動でクリーンアップして、要求されていないファイルを自動削除する必要があることです。/tmp/*.jpgただし、cron ジョブ (「 1 週間以上前に一致するすべてのファイルを削除する」) を使用すると、簡単にそれを行うことができます。

于 2012-06-01T12:00:29.363 に答える