アプリ版:「スタンプのみでお礼する」機能のリリースについて

CakePHP始めたばかりです。
会員登録画面のようなものを作っています。
会員情報を入力し、確認ボタンを押すと確認画面に遷移します。
その確認画面で、入力画面で指定した画像ファイルを表示したいのですが、
webroot/imgではURL直打ちされると見えてしまうので、
webroot以外に保存しました。

アップロード画像の保存まではうまくいったのですが、
$html->image('/system/image/', . $this->data['User']['image'])
としても画像が表示されません。
$this->data['User']['image']にはabc.jpgなどと入っています。

IE上で画像が×になっているところのプロパティをみると、
画像のパスは合っているようです。
試しにwebroot配下に置くバージョンを作ってみたら表示されました。
webroot以外に配置した画像を読み込むにはどうしたら良いのでしょうか。

CakeでなくてもPHPでいいので、教えてください。

A 回答 (6件)

> ここではimgタグを使わずに、imagejpegメソッドで表示しています。



深く考えすぎ。思考が迷走してます。

普通に考えてみましょう。
普通にwebroot/imgにイメージを置いてブラウザでアクセスしたら画像が表示されますよね?
このとき貴方は何かHTMLを書きましたか?ブラウザで直接画像にアクセスしたのだから当然HTMLは書いてませんよね?

これふまえて、
http://phpspot.net/php/man/php/function.imagejpe …
に書いてあるコードをcakeに移植してみて下さい。
んで、そのコントローラ/アクションにブラウザで直接アクセスしたら画像が表示されませんか?


ここまで来たらCTPでIMGを表示する方法を思い出して下さい。
<img src="イメージへのPATH" />
にコントローラ/アクションのURLを当てはめれば良いんですよ。ブラウザでアクセスして画像が表示できるのだから何も問題ない。


4さんの言う通り、まずはコントローラ/アクションの方式できちんと画像が表示するところから解決すべきかな。

この回答への補足

できました!!

contorollerの指定なしで、actionだけ指定しました。
<img src ="<?php echo $html->url('imageDisp'); ?>">
が、しかし自分の書いたものは表示されませんでした。
根本的なミス、画像のパスが違うとかなのでしょうね…

function imageDisp(){
  header( "Content-type: image/jpeg" );
  readfile('/system/photo/image/test.jpg');
}

補足日時:2011/07/08 10:24
    • good
    • 0
この回答へのお礼

そのままコピペさせていただきましたが、
こんな感じでやったのですが、
画像が表示されませんでした。
IEですと×表示になっています。
view側で contoroller/actionと書いていますが、
action側にいってないようです。

-----view側----
<img src ="<?php echo $html->url('users/imageDisp'); ?>">

----controller側----
function imageDisp(){
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

header('Content-Type: image/jpeg');

imagejpeg($im);
imagedestroy($im);
}

お礼日時:2011/07/08 09:01

> function imageDisp(){



一番のアヤシイのはメソッド名。
これusersコントローラの中のメソッドなんですよね?
/app/views/users/ 以下のファイルを全て列挙して下さい。そしたら答えが分かります。
    • good
    • 0
この回答へのお礼

お付き合いありがとうございました。

これを
<img src ="<?php echo $html->url('users/imageDisp'); ?>">
このようにしたら、できました。
<img src ="<?php echo $html->url('imageDisp'); ?>">

どうしてもっと早く気がつかなかったのか…
大変勉強になりました。

お礼日時:2011/07/11 15:08

できないはずがありません。


実際、私自身Cakeでシステム構築時にプログラム経由で画像出力してますので。

まず、画像出力用のプログラムを直接叩いた場合にどうなるか確認した方がいいと思います。
その上で画像が出力されないなら、画像のパスが合っているのかとか正しいヘッダーが出力されているのかとか、一つずつ確認してみてください。


ちなみに画像出力時に「Content-type: image/jpeg」だけでは不十分です。
    • good
    • 0

下のお二方の回答をあわせると、それが答えになります。



1,HTML側におけるIMGの表示は<IMG>タグ

落ち着いてよく考えましょう。
HTMLなのだから普通にIMGタグを使います。echo $image;などしても出ません。

<img src="イメージへのPATH" />


2,イメージへのPATHに$this->Html->urlでURLを指定

そのURLで起動するコントローラのアクションにヘッダを付けてイメージを出力するコードを書いたら良いんです。
それこそ2さんのおっしゃる通り「php 画像 出力」で調べたらいくらでも出てきます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
もちろん調べていますし、「php 画像 出力」でも検索してみました。

http://phpspot.net/php/man/php/function.imagejpe …
ここではimgタグを使わずに、imagejpegメソッドで表示しています。

http://detail.chiebukuro.yahoo.co.jp/qa/question …
ここでもimgタグを使わずに、freadで表示しています。

webroot以外の画像なのでimgタグは使えないと思い、他の方法を探していました。

imagejpegやfreadでは出来ないということでしょうか。

お礼日時:2011/07/07 08:52

そのままファイル内容を出力するだけでは画像を表示することはできません。


画像ファイル出力前に、画像ファイル出力用のヘッダーを出力する必要があります。

詳しくは「php 画像 出力」などのキーワードで検索してみてください。
しっかりつくるなら「ETag」についても調べてみるといいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

header('Content-type: image/jpeg');
↑これですよね?

この画像の出力の前にechoでテキストを出力しているため、
実行ファイルパス名で壊れていますと表示されてしまうのです。
1枚のページに画像のみだといけるのかもしれませんが…

テーブルのあるセルの一部に画像を表示させようとしていますので、
headerが使えないようです。

お礼日時:2011/07/06 22:46

> $html->image('/system/image/', . $this->data['User']['image'])


これはimgタグを出力するだけなので、webroot以外に置いているのにその画像のパスを直接指定しても見えるわけがありません。

webroot以外に配置した画像を出力するには、画像出力用のプログラムを用意してそのプログラムを指定するようにしましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

imageタグで表示できないことがわかり、調べて書いてみたのですが、
画像をテキスト表示したような表示が出力され、
画像が表示できませんでした。

$file = '/photo/test.jpg';

$fp = fopen($file, "rb");
pr(filesize($file));
$image = '';
while(!feof($fp)){
$image .= fread($fp, 8192);
}
echo $image;
fclose($fp);

お礼日時:2011/07/06 12:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!