input type=“file" を入れるとフォーム送信ができない

binbin > input type=“file" を入れるとフォーム送信ができない @ 2016/11/15 15:16
エラー: The request sent to the address '/members/pr_contents/add' was invalid.


開始タグ
$this->BcForm->create('PrContent', array('type'=>'file', 'action' => 'add', 'url' => array(), 'class' => 'form-horizontal’))


$this->BcForm->file('PrContent.img1’)

fileを入れるとエラーになる。コメントアウトすると送信できる。
つまり「input type=“file”」が入ると、was invalid.になる。

$this->BcForm->input('PrContent.img1', array('type'=>'file’))

こんなのも試してみたが結果は同じ。

$this->BcUpload->file('PrContent.img1’)

非推奨ですよと丁寧にメッセージがでた。

なにかとても重要な(かつ単純な)ことを見逃している気がして悩ましいのですが、
2日悩んでこちらに助けを求めに来ました。
なにとぞよろしくお願いします。



Stack Trace
    [internal function] → BcAppController->_blackHoleCallback(string)
    CORE/Cake/Controller/Component/SecurityComponent.php line 622 → call_user_func_array(array, array)
    CORE/Cake/Controller/Component/SecurityComponent.php line 337 → SecurityComponent->_callback(PrContentsController, string, array)
    CORE/Cake/Controller/Component/SecurityComponent.php line 239 → SecurityComponent->blackHole(PrContentsController, string)
    [internal function] → SecurityComponent->startup(PrContentsController)
    CORE/Cake/Utility/ObjectCollection.php line 128 → call_user_func_array(array, array)
    [internal function] → ObjectCollection->trigger(CakeEvent)
    CORE/Baser/Event/CakeEventManager.php line 245 → call_user_func(array, CakeEvent)
    CORE/Cake/Controller/Controller.php line 677 → CakeEventManager->dispatch(CakeEvent)
    CORE/Cake/Routing/Dispatcher.php line 189 → Controller->startupProcess()
    CORE/Cake/Routing/Dispatcher.php line 167 → Dispatcher->_invoke(PrContentsController, CakeRequest)
    APP/webroot/index.php line 151 → Dispatcher->dispatch(CakeRequest, CakeResponse)



■ BaserCMSのバージョン:3.0.11
■ レンタルサーバー名:さくらサーバー VPS
■ スマートURLの利用: ON
■ 設置フォルダ: サブフォルダ
■ PHPスキル(自己評価): D
■ OSの種類:CentOS release 6.7 (Final)
■ PHPのバージョン:PHP 5.6.22 (cli)
■ データベース種類・バージョン:5.6.28 - MySQL Community Server (GPL)
akillerbee > Re: input type=“file" を入れるとフォーム送信ができない @ 2016/11/21 11:32
こんにちはakillerbeeです。

こちら具体的にどのようなフォームをどういった場所に設置したいとお考えでしょうか?
ちなみに私のほうで想像で行った検証で同様の事象が確認できました。
binbin > Re: input type=“file" を入れるとフォーム送信ができない @ 2016/11/25 11:30
akillerbeeさん、ご返信ありがとうございます。

プラグインをカスタマイズして、プラグインの中にフォームを設置しています。
以下、長ったらしくて恐縮ですが、view全部と、controllerの該当部分だけ載せます。
なにか気づいた事などありましたら、ご教授頂けると幸いです。


Controller
<?php 

class PrContentsController extends MembersAppController {
  
  public $name = 'PrContents';

  public $uses = array('Plugin', 'Members.PrContent');
  
  //public $helpers = array('BcUpload');
  
  public $subMenuElements = array('');

  public function beforeFilter() {
    parent::beforeFilter();

    if (preg_match('/^admin_/', $this->action)) {
      $this->subMenuElements = array('members');
    }
  }
  
  public function add(){
	$user = $this->Auth->user();
	if($this->request->data){
		$this->request->data['PrContent']['mypage_id'] = $user['id'];
		if( $this->PrContent->save($this->request->data)){
			$this->setMessage( 'プレスリリースを登録しました。');
			$this->redirect(array('action' => 'index'));
		}else{
			$this->setMessage('エラー', true);
		}
	} 
	$this->pageTitle = 'プレスリリース登録';
    $this->set('user', $user);  
  } 

}
 
?>


View
<?php $this->BcBaser->element('datepicker'); ?>
<?php $this->BcBaser->css(array('Members.members'), array('inline' => false)); ?>
<div class="baser-form baser-form-input">
<?php
if ($this->Session->check('Message.auth')) {
	$this->Session->flash('auth');
}
//add用の変数入れ替え。copy対応
if(empty($PrContent)){
	//$PrContent['PrContent']['release_title'] = ''
	$PrContent['PrContent'] = array(
		'release_title'=>'','pre_release_date'=>'','outline'=>'','body'=>'','keyword1'=>'','keyword2'=>'','keyword3'=>'','keyword4'=>'','rp_url'=>'','site_url'=>'','release_genre'=>'','category'=>'','youtube_url'=>'');
	$PrContent['PrContent']['mail'] = $user['email'];
	$PrContent['PrContent']['tel'] = $user['tel'];
	$PrContent['PrContent']['department_name'] = $user['department_name'];
	$PrContent['PrContent']['name'] = $user['name'];
	$PrContent['PrContent']['isadwords'] = 'do';
	$PrContent['PrContent']['isrelease'] = 'do';
	$PrContent['PrContent']['corporate_name'] = $user['corporate_name'];
}
?>
<?php $this->BcBaser->flash() ?>
<div id="AlertMessage" class="message" style="display:none"></div>
<?php 
	echo $this->BcForm->create('PrContent', array('type'=>'file', 'action' => 'add', 'url' => array(), 'class' => 'form-horizontal'));
	//echo $this->BcForm->create('PrContent', array('action' => 'add', 'class' => 'form-horizontal', 'url' => array()));
	
	?>

<div class="alert alert-info">
	途中で保存して、後から続きを入力できます。<br />
	<span class="text-danger">*</span> 必須
</div>


<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.release_title', 'リリースタイトル') ?><span class="text-danger">*</span></div>
<div class="col-sm-9">
	<div class="control-body">
		<?php echo $this->BcForm->input('PrContent.release_title', array('type'=>'text', 'size'=>25, 'tabindex'=>1, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'placeholder' => '100文字以内', 'value'=>$PrContent['PrContent']['release_title'])) ?>
		<?php echo $this->BcForm->error('PrContent.release_title') ?>
		</div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.pre_release_date', 'プレ・プレスリリース日') ?><span class="text-danger">*</span></div>
<div class="col-sm-9">
	<div class="control-body"><small>PRバズーカに掲載される日。<br />翌日がプレスリリース日として自動設定されます。</small><br>
		<?php echo $this->BcForm->datepicker('PrContent.pre_release_date', array('tabindex'=>2, 'class' => 'form-control form-control-md', 'value'=>$PrContent['PrContent']['pre_release_date'])) ?>
		<?php echo $this->BcForm->error('PrContent.pre_release_date') ?>
		</div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.outline', '要約') ?></div>
<div class="col-sm-9">
	<div class="control-body"><small>リリースの内容を要約、リード文</small><br><?php echo $this->BcForm->input('PrContent.outline', array('type'=>'textarea', 'rows'=>3, 'tabindex'=>3, 'maxlength'=>'250', 'class' => 'form-control form-control-lg', 'placeholder' => '250文字以内、改行不可、タグ不可', 'value'=>$PrContent['PrContent']['outline'])) ?>
	<?php echo $this->BcForm->error('PrContent.outline') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.body', '本文') ?></div>
<div class="col-sm-9">
	<div class="control-body"><small>リリース内容</small><br><?php echo $this->BcForm->input('PrContent.body', array('type'=>'textarea', 'rows'=>6, 'tabindex'=>4, 'maxlength'=>'800', 'class' => 'form-control form-control-lg', 'placeholder' => '800文字以内、改行可、タグ不可', 'value'=>$PrContent['PrContent']['body'])) ?>
	<?php echo $this->BcForm->error('PrContent.body') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.keyword', 'キーワード') ?></div>
<div class="col-sm-9">
	<div class="control-body"><small>リリースに関連するキーワードを自由に入力</small><br>
		<?php echo $this->BcForm->input('PrContent.keyword1', array('type'=>'text', 'size'=>3, 'tabindex'=>5, 'maxlength'=>'15', 'class' => 'form-control form-control-sm', 'value'=>$PrContent['PrContent']['keyword1'])) ?>
		<?php echo $this->BcForm->input('PrContent.keyword2', array('type'=>'text', 'size'=>3, 'tabindex'=>6, 'maxlength'=>'15', 'class' => 'form-control form-control-sm', 'value'=>$PrContent['PrContent']['keyword2'])) ?>
		<br />
		<?php echo $this->BcForm->input('PrContent.keyword3', array('type'=>'text', 'size'=>3, 'tabindex'=>7, 'maxlength'=>'15', 'class' => 'form-control form-control-sm', 'value'=>$PrContent['PrContent']['keyword3'])) ?>
		<?php echo $this->BcForm->input('PrContent.keyword4', array('type'=>'text', 'size'=>3, 'tabindex'=>8, 'maxlength'=>'15', 'class' => 'form-control form-control-sm', 'value'=>$PrContent['PrContent']['keyword4'])) ?>
	<?php echo $this->BcForm->error('PrContent.keyword') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.rp_url', 'ランディングURL') ?></div>
<div class="col-sm-9"><small>メインのみ、複数ある場合は本文へ</small><br>
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.rp_url', array('type'=>'text', 'size'=>25, 'tabindex'=>9, 'maxlength'=>'200', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['rp_url'])) ?>
		<?php echo $this->BcForm->error('PrContent.rp_url') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.site_url', 'サイトURL') ?></div>
<div class="col-sm-9"><small>ホームページURL</small><br>
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.site_url', array('type'=>'text', 'size'=>25, 'tabindex'=>10, 'maxlength'=>'200', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['site_url'])) ?>
		<?php echo $this->BcForm->error('PrContent.site_url') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.release_genre', 'リリースジャンル') ?></div>
<div class="col-sm-9">
	<div class="control-body">
		<?php $genre = Configure::read("bazooka.genre");
			echo $this->BcForm->input('PrContent.release_genre', array('type'=>'select',  'tabindex'=>11, 'class' => 'form-control form-control-md', 'options'=>$genre, 'selected'=>$PrContent['PrContent']['release_genre'])) ?>
		<?php echo $this->BcForm->error('PrContent.release_genre') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.category', 'カテゴリー') ?></div>
<div class="col-sm-9">
	<div class="control-body">
		<?php $category = Configure::read("bazooka.category");
			echo $this->BcForm->input('PrContent.category', array('type'=>'select',  'tabindex'=>12, 'class' => 'form-control form-control-md', 'options'=>$category, 'selected'=>$PrContent['PrContent']['category'])) ?>
		<?php echo $this->BcForm->error('PrContent.category') ?></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.youtube_url', 'YouTube URL') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.youtube_url', array('type'=>'text', 'size'=>25, 'tabindex'=>13, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'placeholder' => 'https://&#12316;から入力', 'value'=>$PrContent['PrContent']['youtube_url'])) ?>
		<?php echo $this->BcForm->error('PrContent.youtube_url') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.corporate_name', '問い合わせ会社') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.corporate_name', array('type'=>'text', 'size'=>25, 'tabindex'=>13, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['corporate_name'])) ?>
		<?php echo $this->BcForm->error('PrContent.corporate_name') ?></div>
</div>
</div>


<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.mail', '問い合わせ e-mail') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.mail', array('type'=>'text', 'size'=>25, 'tabindex'=>14, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['mail'])) ?>
		<?php echo $this->BcForm->error('PrContent.mail') ?></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.tel', '問い合わせ電話番号') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.tel', array('type'=>'text', 'size'=>25, 'tabindex'=>15, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'placeholder' => 'ハイフン無し、半角数字のみ', 'value'=>$PrContent['PrContent']['tel'])) ?>
		<?php echo $this->BcForm->error('PrContent.tel') ?></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.department_name', '担当部署') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.department_name', array('type'=>'text', 'size'=>25, 'tabindex'=>16, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['department_name'])) ?>
		<?php echo $this->BcForm->error('PrContent.department_name') ?></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.name', '担当者名') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.name', array('type'=>'text', 'size'=>25, 'tabindex'=>17, 'maxlength'=>'100', 'class' => 'form-control form-control-lg', 'value'=>$PrContent['PrContent']['name'])) ?>
		<?php echo $this->BcForm->error('PrContent.name') ?></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.isadwords', 'Adwords') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php $isdeliver = Configure::read("bazooka.isdeliver");
		echo $this->BcForm->input('PrContent.isadwords', array('type'=>'radio', 'tabindex'=>5, 'value'=>'do','options'=>$isdeliver, 'class' => 'form-control', 'tabindex'=>18, 'value'=>$PrContent['PrContent']['isadwords'])) ?>
		<?php echo $this->BcForm->error('PrContent.isadwords') ?></div>
</div>
</div>

<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.isrelease', 'プレスリリース') ?></div>
<div class="col-sm-9">
	<div class="control-body"><?php echo $this->BcForm->input('PrContent.isrelease', array('type'=>'radio', 'tabindex'=>5, 'value'=>'do','options'=>$isdeliver, 'class' => 'form-control', 'tabindex'=>19, 'value'=>$PrContent['PrContent']['isrelease'])) ?>
		<?php echo $this->BcForm->error('PrContent.isrelease') ?></div>
</div>

</div>
<div class="form-group">
<div class="col-sm-3 control-label"><?php echo $this->BcForm->label('PrContent.img', 'イメージ') ?></div>
<div class="col-sm-9">
	<div class="control-body">
		<?php //echo $this->BcForm->file('PrContent.img1') ?>
		<?php //echo $this->BcForm->file('PrContent.img2') ?>
		<?php //echo $this->BcForm->input('PrContent.img1', array('type'=>'file')) ?>
		<?php //echo $this->BcUpload->file('PrContent.img1') ?>
		<?php echo $this->BcForm->error('PrContent.img') ?></div>
</div>
</div>


<div class="submit">
<?php echo $this->BcForm->submit('保存', array('div' => false, 'class' => 'btn btn-lg btn-primary form-submit', 'id' => 'BtnLogin')) ?>
</div>
<?php echo $this->BcForm->end() ?>
<div class="section">
<small>注意事項</small>
</div>
</div>
akillerbee > Re: input type=“file" を入れるとフォーム送信ができない @ 2016/11/29 10:20
binbinさんこんにちは。

プラグインはどちらのプラグインでしょうか?
自作でしょうか?

いずれにしてもCSRFのあたりの気も致しますが。。。
binbin > Re: input type=“file" を入れるとフォーム送信ができない @ 2016/11/29 17:54
akillerbeeさん
ご返信ありがとうございます。

プラグインは自作です。そしてCSRFでした。

$this->BcForm->unlockField('PrContent.img1')
これを差し込むことで回避できました。
回避した分は個別にバリデーションかけて対応しようと思います。

お騒がせいたしました。
ありがとうございます。
ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
27 人のユーザが現在オンラインです。 (26 人のユーザが フォーラム を参照しています。)

登録ユーザ: 1
ゲスト: 26