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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

4447閲覧

CakePHP3でUpload Plugin 3.0を使ってファイルがアップロードできない

defaa

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2017/03/15 14:32

編集2017/03/16 08:16

###前提・実現したいこと
CakePHP3でUpload Plugin 3.0を使って画像もしくは動画をアップロードしたいと思っています。
下の公式ドキュメントを参照しながら作っています。
http://cakephp-upload.readthedocs.io/en/latest/

Basic Exampleのように、既存テーブルにphoto,photo_dirのカラムを追加して、
画像ファイルをアップロードしたいです。
http://cakephp-upload.readthedocs.io/en/latest/examples.html#basic-example

###発生している問題・エラーメッセージ
プラグインのロードはできています。
ビヘイビアを登録したコントローラや、addアクションを実行してもエラーメッセージなどは表示されず、
保存されたというメッセージは出力されます。

しかし、実際に作成されたエンティティのphoto,photo_dirフィールドはnullのままで、ルートを設定したディレクトリにもファイルがアップロードされていません。

【追記】
StoreArticlesController.php

public function add() { $storeArticle = $this->StoreArticles->newEntity(); if ($this->request->is('post')) { $storeArticle = $this->StoreArticles->patchEntity($storeArticle, $this->request->data); if ($this->StoreArticles->save($storeArticle)) { $this->Flash->success(__($this->request->data)); return $this->redirect(['action' => 'index']); } $this->Flash->error(__('The store article could not be saved. Please, try again.')); } $this->set(compact('storeArticle')); $this->set('_serialize', ['storeArticle']); }

StoreArticlesTable.php

public function initialize(array $config) { parent::initialize($config); $this->table('store_articles'); $this->displayField('title'); $this->primaryKey('id'); $this->addBehavior('Josegonzalez/Upload.Upload', [ 'photo' => [ 'path' => WWW_ROOT.'files{DS}{model}{DS}{field}{DS}', 'fields' => [ 'dir' => 'photo_dir' ] ] ]); }

add.ctp

<?= $this->Form->create($storeArticle) ?> <fieldset> <legend><?= __('新規投稿') ?></legend> <?php echo $this->Form->input('start', ['empty' => true, 'label' => '掲載開始時間']); echo $this->Form->input('title', ['label' => 'タイトル']); echo $this->Form->input('body', ['label' => '本文']); echo $this->Form->input('photo', ['type' => 'file', 'label' => '画像']); echo $this->Form->input('photo_dir', ['type' => 'hidden']); ?> <script> CKEDITOR.replace( 'body' ); </script> </fieldset> <?= $this->Form->button(__('投稿')) ?> <?= $this->Form->end() ?>

DBテーブル

CREATE TABLE store_articles ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, start DATETIME, title VARCHAR(64) NOT NULL, photo varchar(255), photo_dir varchar(255), body TEXT NOT NULL );

期待する保存先ディレクトリ
webroot/files/StoreArticle/photo/以下

手順は公式ドキュメント通りに踏んでいます。
apacheの作成権限も与えてあり、問題になる部分がわからない次第です。
原因になりそうな部分がありましたら教えていただきたいです。

必要な追加情報あればよろしくお願いいたします。

【追記】
保存されない原因のこころあたりとして、もうひとつ、store_articlesのテーブル構造をmysqlのコマンドライン上でALTER TABLEを用いてphotoとphoto_dirのフィールドを追加しました。
これに伴ってdebug_kitのchacheの部分からキャッシュを削除しましたが、テーブル構造の変更がUpload Plugin 3.0の認識されていない可能性があるのかも?と思います。そのようなケースはありますか?

###補足情報(言語/FW/ツール等のバージョンなど)
Upload Plugin 3.0はPackagistの最新版
composer require josegonzalez/cakephp-upload

PHP 5.6.30 (cli) (built: Jan 19 2017 08:09:42) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies with Xdebug v2.5.0, Copyright (c) 2002-2016, by Derick Rethans
mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapper

CakePHP 3.3.12
Vagrant、Apache(httpd)上で起動

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turbgraphics200

2017/03/15 21:25

実際に書いたコードを掲載してください。
guest

回答1

0

自己解決

add.ctp

<?= $this->Form->create($storeArticle, ['type' => 'file']) ?> <fieldset> <legend><?= __('Edit Store Article') ?></legend> <?php echo $this->Form->input('start', ['empty' => true]); echo $this->Form->input('title'); echo $this->Form->input('body'); echo $this->Form->input('photo', ['type' => 'file', 'label' => '画像']); echo $this->Form->input('photo_dir', ['type' => 'hidden']); ?> </fieldset> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?>

$this->Form->create($storeArticle, ['type' => 'file'])
'type' => 'file'の指定忘れだと思われます。
初歩的な見落としミスでした。

投稿2017/03/16 17:48

defaa

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問