На основе API FileValidator. Файл doc проходит валидацию, форматы docx/xlsx не проходят по умолчанию, ни с выключенным checkExtensionByMimeType.
Mime type загруженных файлов и указанных правил в rules() идентичны. Вывожу в сообщениях в контроллере ниже.
Если не лень, опробуйте сами, 5-7 мин займет.
Model
Код: Выделить всё
[
'document_upload',
'file',
'extensions' => [
'xlsx',
'docx',
'doc',
],
'checkExtensionByMimeType' => false,
'mimeTypes' => [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/msword',
],
]
Код: Выделить всё
public function actionCreate()
{
$model = new Documents();
if ($model->load(Yii::$app->request->post())) {
$model->document_upload = UploadedFile::getInstance($model, 'document_upload');
if ($model->validate() && $model->save()) {
$model->document_upload->saveAs( 'upload/files/' . $model->document);
// Показ mime типа файла
Yii::$app->getSession()->setFlash( 'success', 'Документ успешно добавлен.' . $model->document_upload->type);
return $this->redirect(['index']);
}
// Mime type идентичен с файлами docx,xlsx
Yii::$app->getSession()->setFlash( 'danger', 'Не удалось верифицировать или сохранить файл, попробуйте снова.' . $model->document_upload->type
);
}
return $this->render('create', [
'model' => $model,
]);
}
Код: Выделить всё
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'document_upload')->fileInput() ?>
<?= Html::submitButton( ' Сохранить') ?>
<?php ActiveForm::end(); ?>
1. Дело в validate(), выносил save() внутрь выражения.
2. var_dump при вызове после UploadedFile::getInstance в контроллере дает идентичный mime.
3. Если в rules() указать application/* файлы docx/xlsx проходят валидацию, но ведь под это правило проходят куча типов.
Сожалею, если где-то опечатался, но я проверял несколько раз.
Есть у кого идеи? Спасибо тем не менее за потраченное время на прочтение.