Как опубликовать форму с <input> с типом 'file' и 'multiple', не получая запрос с черной дырой?

0

Доброе утро всем.

У меня проблема с отправкой формы, где у меня есть: моя цель - загрузить много файлов с моей формой, обработать загрузку в моей модели, но я не могу даже добраться до Model :: beforeSave(), потому что мой запрос продолжает черным -holed. Вот код.

Посмотреть:

echo $this->Form->create('Gallery', array('type' => 'file'));
echo $this->Form->hidden('id');
echo $this->Form->input('title', array(
    'required'  => true,
    'label'     => false,
    'class'     => 'form-control'
));
echo $this->Form->input('description', array(
    'required'  => true,
    'label'     => false,
    'type'      => 'textarea',
    'class'     => 'ckeditor'
));
echo $this->Form->input('photos.', array(
    'required'  => false,
    'label'     => false,
    'type'      => 'file',
    'class'     => 'form-control',
    'multiple'  => 'multiple'
));
echo $this->Form->end(array(
    'label'     => $button,
    'class'     => 'btn btn-default'
));

контроллер:

public function admin_update($id = null) {
    if ($id != null && !$this->Gallery->exists($id)) {
        throw new NotFoundException('Elemento non valido');
    }
    if ($this->request->is(array('post', 'put'))) {
        if ($this->Gallery->save($this->request->data)) {
            $this->Session->setFlash('Galleria salvata', 'default', array(), 'good');
            return $this->redirect(array(
                'admin'     => true,
                'action'    => 'index'
            ));
        }
        $this->Session->setFlash('Non sono riuscito a memorizzare la galleria', 'default', array(), 'bad');
    }
    $this->request->data = $this->Gallery->findById($id);
}

Модель:

App::uses('AppModel', 'Model');
App::uses('String', 'Utility');
class Gallery extends AppModel {
    public $useTable = 'gallery';
    public $displayField = 'title';
    public $validate = array(
        'title' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty')
            )
        ),
        'description' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty')
            )
        )
    );

    public function afterSave($created, $options = array()) {
        $dir = new Folder('img/galleries/' . $this->id, true, 0777);

        foreach ($this->data[$this->alias]['photos'] as $Photo) {
            move_uploaded_file($Photo['tmp_name'], 'img/galleries/' . $this->id . '/' . String::uuid()); // I'll add more controls later
        }
    }

    public function beforeDelete($cascade = true) {
        $dir = new Folder('img/galleries/' . $this->id);
        return $dir->delete();
    } 
}

Поэтому каждый раз, когда я пытаюсь загрузить свою форму, мой запрос получает черную ошибку с этой ошибкой

The request has been black-holed
Error: The requested address '/ciardi/admin/galleries/update' was not found on this server.

Stack Trace
CORE/Cake/Controller/Component/SecurityComponent.php line 239 → SecurityComponent->blackHole(GalleriesController, string)
[internal function] → SecurityComponent->startup(GalleriesController)
CORE/Cake/Utility/ObjectCollection.php line 128 → call_user_func_array(array, array)
[internal function] → ObjectCollection->trigger(CakeEvent)
CORE/Cake/Event/CakeEventManager.php line 242 → call_user_func(array, CakeEvent)
CORE/Cake/Controller/Controller.php line 675 → CakeEventManager->dispatch(CakeEvent)
CORE/Cake/Routing/Dispatcher.php line 187 → Controller->startupProcess()
CORE/Cake/Routing/Dispatcher.php line 165 → Dispatcher->_invoke(GalleriesController, CakeRequest)
APP/webroot/index.php line 108 → Dispatcher->dispatch(CakeRequest, CakeResponse)

Та же проблема возникает, даже если я пытаюсь загрузить одно изображение с этим же кодом. Есть ли способ решить мою проблему без плагина? Пожалуйста, помогите мне :)

  • 0
    Есть ли участие JS? Вы должны внести в белый список поля или отключить компонент безопасности для этого действия ( НЕ рекомендуется). Также вы не используете is_uploaded_file (), который следует использовать, чтобы избежать проблем с безопасностью, и у вашей реализации есть еще несколько недостатков.
  • 0
    Спасибо за ответ. Я не использую JS для загрузки. Я знаю, что код не идеален, и я не писал его, чтобы быть безопасным, но это все еще тест на моем личном сервере, просто чтобы понять, как заставить работать мультизагрузку :) Теперь я попробовал белый список с этой строкой код в моем методе GalleriesController :: admin_update () если ($ this-> Gallery-> save ($ this-> request-> data, true, array ('title', 'description', 'id'))), но все же запрос становится черным дыром. О, и я видел, что у меня был кристалл (var_dump ($ this-> request-> data)); перед вызовом Model :: save (), но метод не остановился.
Теги:
cakephp

1 ответ

0

Решила мою проблему. Я просто добавил таблицу в мою базу данных с именем "изображения" и модель изображения. Метод Gallery :: afterSave() вызывает Image :: save() для каждого изображения, которое я пытаюсь загрузить, Image :: beforeSave() проверяет изображение с помощью is_uploaded_file() и перемещает его в правый каталог, а Image :: beforeDelete() помогает мне поддерживать файловую систему в чистоте. Это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню