質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

cakephp2 upload plugin 画像が保存されない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 376

score 7

前提・実現したいこと

よろしくお願いします。
ただ今cakephp2を勉強しており、
公式にあるブログチュートリアルをベースに
upload pluginを追加して画像の投稿を
をできるようにしようとしているところです。

発生している問題・エラーメッセージ

upload pluginの導入方法について以下の
サイトを参考に進めておりました。
http://app-review.poox.xyz/archives/1280

このサイト内にある、新規でテーブルを追加する場合というのを
参考に新規でAttachmentテーブルを作成してやってみましたが、
画像の名前自体はMysqlに登録されるのですが、肝心のimgファイルが
dirの中に入らず詰まっております

その後githubにあるupload pluginの製作者が作ったドキュメント

https://cakephp-upload.readthedocs.io/en/2.x/polymorphic.html

を参考に再度、新規テーブルを追加するやり方でやったのですが、
同じようにwebrootに入らない状態です。

以下ソースコードです。

Model/Attachment.php

<?php
App::uses('AppModel', 'Model');

class Attachment extends AppModel {
    public $actsAs = array(
        'Upload.Upload' => array(
            'attachment' => array(
                'thumbnailSizes' => array(
                    'xvga' => '1024x768',
                    'vga' => '640x480',
                    'thumb' => '80x80',
                ),
            ),
        ),
    );

    public $belongsTo = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'foreign_key',
        ),
        'Message' => array(
            'className' => 'Message',
            'foreignKey' => 'foreign_key',
        ),
    );
}
?>

Model/Message.php

<?php

App::uses('AppModel', 'Model');

class Message extends AppModel {
    public $hasMany = array(
        'Video' => array(
            'className' => 'Attachment',
            'foreignKey' => 'foreign_key',
            'conditions' => array(
                'Video.model' => 'Message',
            ),
        ),
    );
}
?>

Model/Post.php

<?php
App::uses('AppModel', 'Model');

class Post extends AppModel {

    public $actsAs = array('Search.Searchable',);
    public $filterArgs = array(
        // 例
        'tag_id' => array(
            'type' => 'value'
        ),
        'category_id' => array(
            'type' => 'value'
        ),
        'title' => array(
            'type' => 'like'
        ),

);


    public $validate = array(
        'user_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'title' => array(
            'notBlank' => array(
                'rule' => array('notBlank'),
            ),
        ),
    );
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),

        'Category'=>array(
            'className' =>'Category',
            'foreignKey' =>'category_id'
        )
    );


    public $hasMany = array(
            'Image' => array(
                    'className' => 'Attachment',
                    'foreignKey' => 'foreign_key',
                    'conditions' => array(
                            'Image.model' => 'Post',
                    ),
            ),
    );

    public function createWithAttachments($data) {
            // Sanitize your images before adding them
            $images = array();
            if (!empty($data['Image'][0])) {
                    foreach ($data['Image'] as $i => $image) {
                            if (is_array($data['Image'][$i])) {
                                    // Force setting the `model` field to this model
                                    $image['model'] = 'Post';

                                    // Unset the foreign_key if the user tries to specify it
                                    if (isset($image['foreign_key'])) {
                                            unset($image['foreign_key']);
                                    }

                                    $images[] = $image;
                            }
                    }
            }
            $data['Image'] = $images;

            // Try to save the data using Model::saveAll()
            $this->create();
            if ($this->saveAll($data)) {
                    return true;
            }

            // Throw an exception for the controller
            throw new Exception(__("This post could not be saved. Please try again"));
    }




}

View/Posts/add.ctp

<div class="posts form">
<?php echo $this->Form->create('Post'); ?>
    <fieldset>
        <legend><?php echo __('Add Post'); ?></legend>
    <?php
        echo $this->Form->input('user_id');

        echo $this->Form->input('category_id',
            array(
                'type'     =>'select'
            )
        );

        echo $this->Form->input('tag_id',
            array(
                'type'     =>'select'
            )
        );

        echo $this->Form->input('title');
        echo $this->Form->input('body');

        echo $this->Form->create('Post', array('type' => 'file'));
    echo $this->Form->input('Image.0.attachment', array('type' => 'file', 'label' => 'Image'));
    echo $this->Form->input('Image.0.model', array('type' => 'hidden', 'value' => 'Post'));
      echo $this->Form->end(__('投稿'));

        ?>


    </fieldset>
</div>
<div class="actions">
    <h3><?php echo __('Actions'); ?></h3>
    <ul>

        <li><?php echo $this->Html->link(__('List Posts'), array('action' => 'index')); ?></li>
        <li><?php echo $this->Html->link(__('List Users'), array('controller' => 'users', 'action' => 'index')); ?> </li>
        <li><?php echo $this->Html->link(__('New User'), array('controller' => 'users', 'action' => 'add')); ?> </li>
    </ul>
</div>

画像を保存する際のディレクトリはapp/webroot/files/model/fieldsとの事らしいので
filesの中にattachmentファイルを作成してその中にattachmentファイルを作成しています。

パーミッションの変更はしており、upload pluginのverも2系の物を使用しております。

できることは色々やったつもりですが、いまいち原因がわからない状態です。
すいませんがどこが問題かご教授ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/08/21 13:39

    >今cakephp2を勉強しており
    なぜ今「2」なのでしょうか。一応PHP7はサポートされているものの、今から学ぶのであれば古いバージョンを選ぶ理由はないと思いますが、前提や背景を記載いただけますか?

    キャンセル

  • WoL

    2019/08/21 15:09

    会社で必要だからです。

    キャンセル

回答 1

checkベストアンサー

+1

add.ctp において、 $this->Form->create が2箇所出てきています。
formタグが閉じタグの前に2つある状態になっているかと思われますので、ファイルを含むデータが正常にPOSTされていないと考えられます。(multipart/form-data での送信となっていない)

echo $this->Form->input('Image.0.attachment' の前のものは不要ですので削除して、最初の方を $this->Form->create('Post', array('type' => 'file')) としてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/23 19:07

    確かに2重してました。
    修正したところ無事に保存されました!助かりました、ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る