

チュートリアルで作ったようなブログに画像アップロード機能を実装しようとしています。  
入力フォームに画像アップロードのフォームは作りました。  
それを次の確認画面で表示させたいのですが、なぜか表示されません(chromeなのですが絵文字のようなマークでしか出ません)。

今考えている方法は、  
■記事投稿画面のController  
1.postされたらsessionに記入  
2.`$_file`の`tmp_name`を取得  
3.`tempnam()`で`app/webroot`下のimgフォルダ内に一時ファイルを作成  
4.`move_uploaded_file()`でアップロードした画像を、作成した一時ファイルに移す  
5.作成した一時ファイルのディレクトリをsessionに記入  
■確認画面のController  
6.session から`$_file`のnameと一時ファイルのディレクトリを取得  
7.`$this->set`してview画面で使えるようにする  
■確認画面のView  
8.`html->image`で取得

こんな感じにすればできるのではないかと考えたのですが、  
3のimg下にディレクトリを作ることがなぜかできません。/tmp下になって出てきてしまいます。  
権限は777にしてありますが、ほかにどんな原因があるのでしょう。

またよりよい方法があれば教えていただきたいです。  
(勉強を兼ねているのでpluginはできるだけ使わない方針で)

追加:contorllerのソースはこんな感じです。

[code]

    > public function add() {
        if ($this->request->is('post')) {
            $this->Post->set($this->request->data);
              if($this->Post->validates()){
                $this->request->data['Post']['user_id'] = $this->Auth->user('id');
                $this->Session->write('Session',$this->request->data);
                if(isset($this->request->data['Post']['image'])){
                    $file_name = $this->request->data('Post.image.tmp_name');
                    $tmpfile = tempnam("/var/www/html/share/cake/cakephp-2.6.7/app/webroot/img/tmp","xxx");
                    $this->Session->write('Session.xxx',$tmpfile);
                    if(move_uploaded_file($file_name,$tmpfile)){
                        return $this->redirect(array('action'=>'confirm'));
                    }else{ $this->Session->setFlash(__('ファイルをtmpに保存できませんでした。'));}
                }
              }
        }
    }
    
    public function confirm() {
        if ($this->Session->check('Session')) {
            $title = $this->Session->read('Session.Post.title');
            $body = $this->Session->read('Session.Post.body');
            //画像処理
            $file_name = $this->Session->read('Session.Post.image.name');
            if(isset($file_name)){
                //move_uploaded_file($file_name,$tmpfile);
                $image = $this->Session->read('Session.xxx');
                //mkdir($image,0777);
                $this->set('image',$image);
                }
            $this->set('title',$title);
            $this->set('body',$body);
    
[/code]


CC BY-SA 3.0
2015-09-14T06:11:02.843
16585
2015-09-18T01:26:22.023
2015-09-18T01:26:22.023
12316
12316
question
php cakephp
cakephp2でアップロードした画像の表示


該当箇所のソースがまったく提示されていないために憶測でしか書けませんが、手順3において `tempnam()` で一時ファイルを
`app/webroot/img`
配下に作成しようとしているときに、まだ存在しないディレクトリを指定していませんか。あるいは相対pathを指定していませんか。

tempnam()
は指定したディレクトリが存在しない場合や、あるいはディレクトリが存在しても書き込み権限がない場合は、代わりにシステムのテンポラリディレクトリにファイルを作成しに行きます。

[PHP: tempnam - Manual](http://php.net/manual/ja/function.tempnam.php)

> **説明**  
>  一意なテンポラリファイル名を、パーミッションを 0600 に設定し、 指定したディレクトリに作成します。
> 指定したディレクトリが存在しない場合やディレクトリに書き込めない場合は、tempnam() はシステムのテンポラリディレクトリにあるファイル名を生成し、
> そのファイルへのフルパスを (名前を含めて) 返します。

`img` よりさらに深い階層に一時ファイルを置きたいのであれば、あらかじめその階層のディレクトリを作っておく必要があります。Cakeの場合は
[Folder::create()](http://book.cakephp.org/2.0/ja/core-utility-libraries/file-
folder.html#Folder::create) を使うと便利でしょう。


CC BY-SA 3.0
2015-09-15T15:34:21.377
16654
2015-09-15T15:34:21.377
10492
16585
answer