CakePHP 3: загрузка нескольких файлов возвращает строку вместо массива
Привет у меня проблема с загрузкой нескольких файлов. Всякий раз, когда я пытаюсь получить доступ к свойствам файла, он не позволяет мне. Я отладил свои данные, и вот вывод: вместо того, чтобы возвращать мне массив, он просто возвращает мне строку под data ['files']. Поэтому мне не хватает таких свойств, как "tmp_name", "name" и т. Д.
Мой код в моем файле.ctp:
<?= $this->Form->create('annonce') ?>
<fieldset>
<legend><?= __('Publier une annonce') ?></legend>
<?php
echo $this->Form->input('title', ['label' => 'Titre annonce']);
echo $this->Form->input('description', ['label' => 'Description annonce', 'type' => 'textarea']);
echo $this->Form->input('price', ['label' => 'Prix ', 'type' => 'number', 'placeholder' => '0$']);
echo $this->Form->input('type_annonce', array(
'options' => array('Acheter', 'Vendre', 'Échanger', 'Autre'),
'empty' => 'Choisissez une option'), ['label' => 'Je souhaite']);
echo $this->Form->input('category', array(
'options' => array('Cheval', 'Poney', 'Matériel', 'Pension', 'Demi-pension'),
'empty' => 'Choisissez une option'), ['label' => 'Je souhaite']);
echo $this->Form->input('files.', array('type' => 'file', 'multiple' => 'true', 'enctype'=>'multipart/form-data'));
?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>
И мой контроллер:
public function add()
{
debug($this->request);
$now = Time::now();
$this->log('In add annonce !', 'debug');
$annonce = $this->Annonces->newEntity();
if ($this->request->is('post')) {
if(!empty($this->request->data)) {
$this->Flash->succes(__('Annonce files not empty'));
foreach ($this->request->data['files'] as $file) {
$filename = $file['name'];
$file_tmp_name = $file['tmp_name'];
$dir = WWW_ROOT.'img'.DS.'upload';
$allowed = array('png', 'jpg', 'jpeg');
echo "<pre>"; print_r($photo); echo "</pre>";
if ( !in_array( substr( strrchr( $filename , '.') , 1 ) , $allowed) ) {
throw new InternalErrorException("Error Processing Request.", 1);
}elseif( is_uploaded_file( $file_tmp_name ) ){
move_uploaded_file($file_tmp_name, $dir.DS.Text::uuid().'-'.$filename);
}
}
}
else {
$this->Flash->error(__('Not in images'));
}
$annonce = $this->Annonces->patchEntity($annonce, $this->request->data);
$annonce->id_user = $this->request->session()->read('Auth.User.id');
$annonce->publication_date = $now;
if ($this->Annonces->save($annonce)) {
$this->log('Success saving annonce !', 'debug');
$this->Flash->success(__('The annonce has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->log($annonce->errors(), 'debug');
$this->Flash->error(__('The annonce could not be saved. Please, try again.'));
}
}
$this->set(compact('annonce'));
$this->set('_serialize', ['annonce']);
}
2 ответа
Решение
Попробуйте эту структуру.
<?= $this -> Form -> create($annonce, ['type' => 'file']) ?>
...
<?= $this -> Form -> input('files[]', ['type' => 'file', 'class' => 'file', 'multiple', 'label' => __('Select Images')]) ?>
...
<?= $this -> Form -> end() ?>
Вам нужно добавить enctype='multipart/form-data' в форму, когда в нее включены файлы. Сделайте это так:
<?= $this->Form->create($annonce, ['type' => 'file']) ?>
Примечание. Вы должны напрямую использовать сущность в качестве первого параметра для вспомогательной функции создания формы вместо строки.