Не удается запустить загрузку нескольких файлов в 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?