@shanik

Почему не отправляются файлы через AJAX Yii2?

<?php $f = ActiveForm::begin(['id' => 'flora', 'action' => $flora->isNewRecord ? Url::base(true) . '/create-flora/add' : Yii::$app->request->url, 'options' => ['enctype' => 'multipart/form-data']]); ?>
...
    <?= $f->field($foto, 'file[]')->fileInput(['multiple' => true, 'class' => 'btn btn-success'])->label('Добавить фотографии'); ?>
        <?= Html::submitButton($flora->isNewRecord ? 'Добавить флору' : 'Изменить флору', ['id' => 'addFlora', 'class' => 'btn btn-success']) ?>

       <?php ActiveForm::end(); ?>


$(function () {
        $('#addFlora').click(function (e) {
            var $form = $('#flora');
            var formData = new FormData($form[0]);
            var id_taxon = 0;
            if ($('.table-striped > tbody > tr input:radio').is(':checked')) {
                id_taxon = $('.table-striped > tbody > tr input:radio').attr('data-key');
            }

           /* var file_data = $('#foto-file').prop('files')[0];
            var form_data = new FormData();
            form_data.append('file', file_data);
            console.log(file_data);*/

           /* $.each($('#foto-file')[0].files, function(i, file) {
                formData.append('Foto[file][]', file);
            }); */

            formData.append('Flora[taxon_id]',id_taxon);
            $.ajax({
                processData: false,  // Important!
                contentType: false,
                cache: false,
                type: $form.attr('method'),
                url: $form.attr('action'),
                data: formData
            }).done(function (data) {
                console.log(data);
            }).fail(function () {
                console.log('fail');
            });
            //отмена действия по умолчанию для кнопки submit
            e.preventDefault();
        });
    });


59ce02cb27a01745187963.png
  • Вопрос задан
  • 854 просмотра
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
А почему Вы решили, что они будут отправляться через ajax?
Что-бы это случилось - нужен совершенно другой подход.
Используйте класс FormData() и всё у Вас получится.
Вот небольшой пример:
jQuery
$(function(){
	function Testing(url, form){
	    var file = '';
		var formdata = new FormData(form[0]);
		formdata.forEach(function(item, i, arr){
			if(i == 'files'){
					formdata.append(item.name, item)
			}
		})

        $.ajax({
        	url: url,
        	type: 'POST',
        	processData: false,
            contentType: false,
        	data: formdata,
        	success: function(data){
        		console.log(data)
        	}
        })
	}

	$('#form-data').on('submit', function(e){
		e.preventDefault();
		Testing('upload.php', $(this))
	})
})

PHP
Ну а тут уж сами сделайте, с этим сложностей у Вас не возникнет.

P.S.
И, кстати, к yii2 загрузка файлов при помощи ajax не имеет никакого отношения. Хотя на yii2, хоть на чистом js + php надо использовать FormData()
Ответ написан
Комментировать
@shanik Автор вопроса
formData.forEach(function(item, i, arr){
                console.log(item+' '+i+' '+arr);

возвращает это:
59ce2af9eab0d097456311.png

Как оттуда вытащить сами файлы, чтобы нормально заполняли массив:
[Foto] => Array
        (
            [file] => Array
                (
                    [0] => 
                )
        )
Ответ написан
Ваш ответ на вопрос

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

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