Не удается запустить загрузку нескольких файлов в CakePHP 3.8

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

Deprecated (16384): Accessing `here` as a property will be removed in 4.0.0. Use request->getAttribute("here") instead. - /home1/thecyb80/seibo.the-cyberpunk.com/src/Controller/AppController.php, line: 92
 You can disable deprecation warnings by setting `Error.errorLevel` to `E_ALL & ~E_USER_DEPRECATED` in your config/app.php. [CORE/src/Core/functions.php, line 311]

Warning (512): Unable to emit headers. Headers sent in file=/home1/thecyb80/seibo.the-cyberpunk.com/vendor/cakephp/cakephp/src/Error/Debugger.php line=856 [CORE/src/Http/ResponseEmitter.php, line 51]

Warning (2): Cannot modify header information - headers already sent by (output started at /home1/thecyb80/seibo.the-cyberpunk.com/vendor/cakephp/cakephp/src/Error/Debugger.php:856) [CORE/src/Http/ResponseEmitter.php, line 152]

Warning (2): Cannot modify header information - headers already sent by (output started at /home1/thecyb80/seibo.the-cyberpunk.com/vendor/cakephp/cakephp/src/Error/Debugger.php:856) [CORE/src/Http/ResponseEmitter.php, line 185]

Warning (2): Cannot modify header information - headers already sent by (output started at /home1/thecyb80/seibo.the-cyberpunk.com/vendor/cakephp/cakephp/src/Error/Debugger.php:856) [CORE/src/Http/ResponseEmitter.php, line 185]

Вот мой код: add.ctp

<?= $this->Form->create($atividade, ['type' => 'file']) ?>

[...]

<div class="form-group m-0">
    <label class="btn btn-light p-3 rounded border d-flex align-items-center justify-content-center flex-column" style="cursor: pointer; min-height: 350px;">
        <strong class="d-block">Selecione o(s) arquivo(s) da atividade. Você pode enviar até 10 arquivos.</strong>
        <span class="exercicio-nome d-flex aling-items-center justify-content-center w-100 mt-3"></span>
        <?= $this->Form->file('arquivos[]', [ 'class' => 'exercicio-item', 'multiple' => 'multiple', 'style' => 'display: none;', 'label' => [ 'class' => 'd-none' ] ]) ?>
    </label>
</div>

Валидация основана в AtividadesTable.php (это единственное вхождение поля):

$validator
    ->scalar('arquivos')
    ->maxLength('arquivos', 255)
    ->allowEmptyString('arquivos')
    ->allowEmptyFile('arquivos');

Я пробовал несколько решений, которые нашел в Интернете, но ни одно мне не помогло. Я использую CakePHP 3.8.11 поверх PHP 7.2.31.

Вот мой composer.json установленные модули (не знаю, может ли это помочь):

"require": {
    "php": ">=5.6",
    "cakephp/cakephp": "3.8.*",
    "cakephp/migrations": "^2.0.0",
    "cakephp/plugin-installer": "^1.0",
    "mobiledetect/mobiledetectlib": "2.*"
}

Поскольку я не могу пройти этот шаг, я предполагаю, что на данный момент мой Контроллер не имеет значения. Что я могу сделать?


Изменить: 06/04 (по Salines)

Загрузка нескольких файлов (загружено 4 файла)

С помощью

<?= $this->Form->file('arquivos[]', [ 'class' => 'exercicio-item', 'multiple' => 'multiple', 'style' => 'display: none;', 'label' => [ 'class' => 'd-none' ] ]) ?>

Выход

(Page just refreshs)

Загрузка одного файла

С помощью

<?= $this->Form->file('arquivos[]', [ 'class' => 'exercicio-item', 'multiple' => 'multiple', 'style' => 'display: none;', 'label' => [ 'class' => 'd-none' ] ]) ?>

Выход

(Page just refreshs)

Загрузка нескольких файлов (загружено 4 файла)

С помощью

<?= $this->Form->file('arquivos', [ 'class' => 'exercicio-item', 'multiple' => 'multiple', 'style' => 'display: none;', 'label' => [ 'class' => 'd-none' ] ]) ?>

Выход

 /src/Controller/AtividadesController.php (line 159)

[
    'nome' => 'Atividade teste',
    'status' => '1',
    'users' => [
        '_ids' => [
            (int) 0 => '306'
        ]
    ],
    'turmas' => [
        '_ids' => [
            (int) 0 => '17'
        ]
    ],
    'materias' => [
        '_ids' => [
            (int) 0 => '45'
        ]
    ],
    'descricao' => '<p>Teste</p>
',
    'comeca_dia' => [
        'year' => '2020',
        'month' => '06',
        'day' => '04'
    ],
    'termina_dia' => [
        'year' => '2020',
        'month' => '06',
        'day' => '04'
    ],
    'video' => '',
    'aviso_do_professor' => 'Teste',
    'arquivos' => [
        'tmp_name' => '/tmp/phpafKkWr',
        'error' => (int) 0,
        'name' => 'imagem_sobre.png',
        'type' => 'image/png',
        'size' => (int) 600995
    ]
]

Загрузка нескольких файлов (загружено 4 файла)

С помощью

<?= $this->Form->file('arquivos. ', [ 'class' => 'exercicio-item', 'multiple' => 'multiple', 'style' => 'display: none;', 'label' => [ 'class' => 'd-none' ] ]) ?>

Выход

(Page just refreshs)

AtividadesController

Я покажу свой AtividadesController.php (добавить метод):

/**
* Add method
*
* @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
*/
public function add($nivelId = null)
{
    $atividade = $this->Atividades->newEntity();

    if ($this->request->is('post')) {

        // Edit - Stackru
        debug($this->getRequest()->getData()); exit;

        $atividade = $this->Atividades->patchEntity($atividade, $this->request->getData());

        die(debug($_FILES));

        // Salvando os arquivos
        if (!empty($_FILES['arquivos']['name'])) {
            $file = $_FILES['arquivos'];
            $arquivoName = $file['name'];
            $userId = $this->Auth->user('id');

            $ext = substr(strtolower(strrchr($arquivoName, '.')), 1);
            $arr_ext = array('zip', 'rar', 'pdf', 'doc', 'docx', 'ppt', 'pptx');

            if (in_array($ext, $arr_ext)) {
                $imgHashed = md5($arquivoName) . time() . '.' . $ext;
                $fileDir = WWW_ROOT . 'files/' . $userId;

                if (!is_dir($fileDir)) {
                    mkdir($fileDir);
                }

                @move_uploaded_file($file['tmp_name'], $fileDir . '/' . $imgHashed);

                $atividade['arquivos'] = $imgHashed;
                $atividade['arquivo_nome'] = $arquivoName;
            } else {
                $this->Flash->error(__("Só aceitamos imagens dos tipos 'zip', 'rar', 'pdf', 'doc', 'docx', 'ppt' ou 'pptx'."));

                return $this->redirect(['action' => 'add']);
            }
        }

        if ($this->Atividades->save($atividade)) {
            $this->Flash->success(__('A atividade foi salva.'));

            return $this->redirect(['action' => 'index', $this->Auth->user('id')]);
        }
        $this->Flash->error(__('A atividade não pode ser salva. Por favor, tente novamente.'));
    }

    $arquivos = $this->Atividades->Arquivos->find('list');
    $materias = $this->Atividades->Materias->find('list');

    if ($nivelId) {
        $turmas = $this->Atividades->Turmas->find('list')->matching('Nivels', function($q) use ($nivelId) {
            return $q
                ->select()
                ->where(['Nivels.id' => $nivelId]);
        });
    } else {
        $turmas = $this->Atividades->Turmas->find('list');
    }
    $users = $this->Atividades->Users->find('list')->where(['tipo' => 'professor']);
    $this->set(compact('atividade', 'arquivos', 'materias', 'turmas', 'users'));
}

Я что-то пропустил? Может быть, какой-нибудь компонент CakePHP? Некоторое расширение PHP?

0 ответов

Другие вопросы по тегам