Ajax-загрузка файлов с расширениями zip, tar и других

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
malariuz
Сообщения: 26
Зарегистрирован: 2016.05.12, 09:25

Ajax-загрузка файлов с расширениями zip, tar и других

Сообщение malariuz »

Доброго времени суток!

Вообщем ситуация такая:
есть модель, у которой есть свойство по типу это файл. В виде есть форма сделанная через ActiveForm. Нужно через ajax запрос загрузить архив. Но он не загружается (с условием, что нужно провалидейтить расширение файла, а не просто его залить).

UPDATE: Правда сейчас он стал загружаться, но валидацию не проходит.

UPDATE: При попытке получить массив $_FILES и увидеть его в консоли, появляется полностью пустой массив.

Код:

Метод

Код: Выделить всё

public function actionUploadTest()
    {
        $model = new \app\models\UploadForm();

        if (Yii::$app->request->isAjax) {
            if ($model->upload()) {
                Yii::$app->session->setFlash('success', 'Файл загрузился');
                return 'everything is allright!';
            } else {
                return 'something is gone wrong!';
            }
        }

        return $this->render('upload-test', ['model' => $model]);
    }
View

Код: Выделить всё

use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\helpers\Url;

$url = Url::to();
$js = <<<JS
    jQuery("form").on("submit", function(e) {
        e.preventDefault();
        let data = new FormData();
        data.append('file', jQuery("#uploadform-file")[0].files[0]);
        console.dir(jQuery("#uploadform-file")[0].files[0]);
        jQuery.ajax({
            url: "$url",
            data: data,
            method: "POST",
            cache: false,
            contentType: false,
            processData: false,
            success: function(r) {
                console.log(r);
            },
        });
    });
JS;
$this->registerJs($js);

$form = ActiveForm::begin();

echo $form->field($model, 'file')->fileInput();

echo Html::submitButton('Отправить');

ActiveForm::end();
Модель

Код: Выделить всё

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * UploadForm is the model behind the upload form.
 */
class UploadForm extends Model
{
    public $file;


    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
			['file', 'file', 'extensions' => '/* docx,doc,txt,xls,xlsx,pdf, */zip,7z,gz,gzip,tar,tar-gz,tgz'],
        ];
    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'file' => 'Файл',
        ];
    }

    /**
     * Just uploads the file
     * @return bool whether upload or not
     */
    public function upload()
    {
        if (!$this->validate()) {
            return;
        }

        $this->file = \yii\web\UploadedFile::getInstance($this, 'file');
        $this->file->saveAs('uploads/' . $this->file->baseName . time() . '.' . $this->file->extension);
        return true;
    }
}
Последний раз редактировалось malariuz 2019.04.09, 19:37, всего редактировалось 2 раза.
Ivan Kosh
Сообщения: 13
Зарегистрирован: 2019.04.02, 07:03

Re: Ajax-загрузка архивов при использовании модели

Сообщение Ivan Kosh »

Не уверен что это хорошая идея грузить файл через ajax.

Как я понимаю первым делом нужно начать с валидации формы без отправки данных

Код: Выделить всё

form.data('yiiActiveForm').submitting = false;
form.yiiActiveForm('validate', true);
Далее нужно как-то понять что во всех поля соответствую условиям(как вариант пересчитать поля с классом "has-error", а может у yiiActiveForm есть еще что-то кроме 'validate'). C этим точно не подскажу.

И только потом выполнять ajax на отправку
Аватара пользователя
malariuz
Сообщения: 26
Зарегистрирован: 2016.05.12, 09:25

Re: Ajax-загрузка архивов при использовании модели

Сообщение malariuz »

Ivan Kosh писал(а): 2019.04.08, 20:37 Не уверен что это хорошая идея грузить файл через ajax.

Как я понимаю первым делом нужно начать с валидации формы без отправки данных

Код: Выделить всё

form.data('yiiActiveForm').submitting = false;
form.yiiActiveForm('validate', true);
Далее нужно как-то понять что во всех поля соответствую условиям(как вариант пересчитать поля с классом "has-error", а может у yiiActiveForm есть еще что-то кроме 'validate'). C этим точно не подскажу.

И только потом выполнять ajax на отправку
Спасибо за идеи, но с валидацией всё хорошо, если это не файлы-архивы (то есть файлы с расширением zip, tar и др.), вот в чём момент.
При этом в глобальном массиве в PHP коде нет добавленного массива файлов, хотя при проверках он добавляется. Проверяю в javascript вот этим кодом

Код: Выделить всё

for(var pair of formData.entries()) {
        console.log(pair[0]+ ', '+ pair[1]);
    }
Ответить