Задать вопрос
@ZaurK

Почему в yii2 не проходит валидация docx?

Что-то не могу понять, при загрузке файлов не проходят файлы с расширениями docx и txt, остальные проходят и грузятся. Причем ошибка происходит уже в процессе загрузки. Помогите понять, что не так?
Контроллер:
<?php
namespace backend\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\Controller;
use backend\models\Fileload;
use yii\web\UploadedFile;

class FileloadController extends Controller
{
	 /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
		    'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index', 'update', 'view', 'create', 'delete'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
					
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }
    public function actionIndex()
    {
        $model = new Fileload();
        $dir = Yii::getAlias('@uploads') . '/files/';
		$name = 'price_titankbr';
		
        if (Yii::$app->request->isPost) {
            $model->loadFile = UploadedFile::getInstance($model, 'loadFile');
            $this->deleteIfExists($dir);
			if ($model->upload($dir, $name)) {
                // file is uploaded successfully
                return $this->redirect(['fileload/index']);
            }
        }

        return $this->render('upload', ['model' => $model]);
    }
	
	private function deleteIfExists($dir)
	{
		$files = scandir($dir);
		$files = array_slice($files,2);
		//print_r($files); exit;
		foreach($files as $fl){
			unlink($dir . $fl);
		}
		
	}
	
}

Форма:
<?php
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
    <?= $form->field($model, 'loadFile')->fileInput()->label('Файл прайс-листа') ?>
    <button>Загрузить</button>
<?php ActiveForm::end() ?>

Модель:
<?php

namespace backend\models;

use Yii;
use yii\base\Model;
use yii\web\UploadedFile;

class Fileload extends Model
{
    /**
     * @var loadFile
     */
    public $loadFile;

	public $maxSize = 1024*1024*2;
	public $tooBig = 'Файл не должен превышать 2Мб';
	
    public function rules()
    {
        return [
            [['loadFile'], 'file', 'skipOnEmpty' => false, 'extensions' => ['pdf', 'doc', 'docx', 'txt',  'xls', 'xlsx'], 'maxSize' => $this->maxSize, 'tooBig' => $this->tooBig],
        ];
    }
    
    public function upload($dir, $name)
    {
        if ($this->validate()) {
            $this->loadFile->saveAs($dir . $name . '.' . $this->loadFile->extension);
			Yii::$app->session->setFlash('success', "Прайс-лист обновлен");
            return true;
        } else {
            return false;
        }
    }
}
  • Вопрос задан
  • 1033 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Фокус вот в чем. Есть два варианта определения расширения файла:
- по mime типу
- обрезая последнюю точку
в yii по умолчанию первый. Но в следствии тех или иных причин mime type у Вас отрабатывает коряво (ну или не так как ожидается).
Поэтому сделайте checkExtensionByMimeType => false возможно этого вполне Вам достаточно. Или решите вопрос с MimeType для docx и txt.
https://www.yiiframework.com/doc/api/2.0/yii-valid...
Резюмируя - проблема за пределами yii2, копайте сервер или используйте способ "в лоб".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы