3

Cake PHP で GD lib を使用してサムネイル写真を作成しようとしています。

サイズ変更されたサムネイルを tmp ディレクトリに書き込み、適切な URL を作成して tmp ディレクトリから画像を表示できます。

//set up empty GD resource  
$tmp = imagecreatetruecolor(200*$iw/$ih, 200);
//create thumbnail image in the empty GD resource
imagecopyresampled($tmp, $src, 0, 0, 0, 0,200*$iw/$ih, 200, $iw, $ih);
//build full path to thumbnail in the cakephp tmp directory
$thumbfile = APP.'tmp/thumb.jpg';
//build URL path to the same thumbnail
$thumblink = $this->webroot.'tmp/thumb.jpg';
//write jpeg to the tmp directory
$return=imagejpeg($tmp,$thumbfile);
//write out the image to client browser
echo "<img=\"$thumblink\" alt=\"thumb\" height=\"200\" width=\"200*$iw/$ih\">";

サムネイルが作成され、tmp ディレクトリに書き込まれますが、URL にアクセスしようとすると、次のエラー メッセージが表示されます。

Error: TmpController could not be found.
Error: Create the class TmpController below in file: app/Controller/TmpController.php

明らかに、ルーティング エラーがあります。Cake は、tmp ディレクトリを調べる代わりに、tmp コントローラを呼び出そうとします。これを修正するにはどうすればよいですか、または GD lib を使用して一時的なサムネイルを提供する別の方法はありますか? セッションまたはユーザーごとに固有のサムネイルを作成する予定ですが、まずこれを機能させる必要があります。

Config/routes.php でのルーティング:

Router::connect('/', array('controller' => 'MsCake', 'action' => 'index'));
Router::connect('/pages/*', array('controller' => 'pages'));
CakePlugin::routes();

ThumbnailHelper を見ましたが、それは GD Lib を使用していません。また、外部から apache でアクセスできないディレクトリに保存されているファイルにアクセスできるようにする必要がありますが、それらにアクセスするための一時的なシンボリック リンクにアクセスすることさえできません。例えば。

  • 問題のファイルを指す一時的なシンボリック リンクを tmp ディレクトリに作成します。
  • 上記のように、$this->webroot.'tmp/link-to-myfile' を使用して、シンボリック リンクを指す HTML リンクを作成します。

...そして、上記と同じエラーが発生します - エラー: TmpController が見つかりませんでした。

4

2 に答える 2

4

そんなことしないで

tmp ディレクトリ内のファイルを Web アクセス可能にするために何かを行うと、サイトのセキュリティが大幅に低下します。tmp ディレクトリ内のものは、Web アクセス可能であることは決して想定されていません。

画像をウェブルートに入れます

一時的なイメージを webroot ディレクトリに配置することをお勧めします。これは、通常、Web からアクセスできる唯一のディレクトリです。例えば:

$filename = md5($userId);
$thumbfile = APP.'webroot/img/cache/' . $filename . '.jpg';

...
$url = '/img/cache/' . $filename . '.jpg';

またはコントローラーアクションにルーティングします

または、コントローラ アクションにルーティングして、メディア ビュー クラスを使用してリクエストを処理します。ただし、php を使用した画像の提供は無料ではないことに注意してください - リクエストの処理中に顕著な遅延が発生する可能性があります - 一方、静的ファイルを指すことには、このコスト/リスクはありません。コンテンツ。

于 2013-01-20T16:46:18.823 に答える
0

一時的なものなので、できることは、画像を tmp ディレクトリではなくデータ URL として表示することです (imagecopyresampled()呼び出し後に置き換えます):

ob_start();
imagepng($tmp);
$contents =  ob_get_contents();
ob_end_clean();
imagedestroy($tmp);


//write out the image to client browser
echo "<img src='data:image/png;base64,".base64_encode($contents)."' alt='thumb' height='200' width='".(200*$iw/$ih)."'>";

画像はバイナリとして送信されるのではなく base64 でエンコードされるため、これは帯域幅を少し多く使用します。

于 2013-01-20T16:40:27.700 に答える