Имя Файла Из Filefield

У меня задачка достать имя файла из FileField не используя для этого модель.

Проблема загрузки файла меня не интересует, поскольку все задачи решаются на локальном сервере. То есть, я использую Yii, как среду программирования.

Потом это имя файла я аяксом отправляю в контроллер, и контроллер обрабатывает файл, используя имя файла.

С аяксом я разобрался.


<?php

$form = $this->beginWidget('CActiveForm', array(

    'id' => 'files-form',

    'htmlOptions' => array('enctype' => 'multipart/form-data'),

        ));

?>


<?php echo CHtml::fileField('nfile', 'nfile', array('id' => 'nfile')); ?>


<?php

echo CHtml::ajaxButton('Сохранить', $this->createUrl('/tools/readfile/', array('id' => 'idfile')), array(

    'data' => 'js:"text="+$("#nfile").html()',

    'type' => 'GET',

    'success' => 'function(html){

                    alert(html)}',

));

?>

<?php $this->endWidget(); ?>

Что-то не то я делаю. FileField не получает имени файла.


    public function actionReadfile() {


        CVarDumper::dump($_GET);      // массив передаётся

        CVarDumper::dump($_FILES);    // массив пустой

        

    }

Очень нужно получить имя файла в контроллере. Спасибо.

Ну, во-первых файлы через аякс грузятся сравнительно хреново, во-вторых, половина браузеров не любят отдавать данные по файлам джаваскрипту.

Полагаю, проблема где-то тут.

Мне загружать-то ничего не нужно, только имя файла серверу отослать. Если простого метода не найдется, придется модель создавать, и уже из модели вытягивать имя файла. А не хочется.

Спасибо.

передаваемые данные нужно serialize()

  • укажите ‘dataType’=> ‘json’, для CHtml::ajaxButton

Тоже есть такая проблемка. Сейчас сделаю, напишу решение.

Если можно поподробнее - как реализовать тогда обработку формы с ajaxButton?

Так совсем ничего не передается.

Массив FILES пуст, в посте значения передаются нормально.

Собственно говоря делал свой превью на этой форме, там это выглядело вот так:




function getImage( e ) {

    var fd = new FormData();

    fd.append( "Applications[image]", $(e)[0].files[0]);

    $.ajax({

        url: '/applications/preview',

        type: 'POST',

        cache: false,

        data: fd,

        processData: false,

        contentType: false,

        beforeSend: function () {

            $(".image_preview").addClass("loading");

            $(".image_preview").css({"min-height":"40px","display":"block","margin-top":"20px","background-position":"5px 20px"});

        }, 

        success: function (data) { 

            $(".image_preview").empty();

            $(".image_preview").append(data);

        },

        complete: function () {

            $(".image_preview").removeClass("loading");

        },

        error: function () {

            alert("ERROR in upload");

        }

    });

};



Возможно в success ajaxSubmit делать аякс запрос там где у нас выводятся уведомления об успешном сохранении?

У кого еще есть идеи как такое сделать?

Собственно говоря получилось.

Итого что нам нужно - нужен ajaxSubmitButton (кстати странно что он не передает файл из CHtml::activeFileField).




<?php echo CHtml::ajaxSubmitButton(Yii::t("app","create"), Yii::app()->request->url, array(

                'type' => 'post',

                'success' =>

                'js:function (data) {

                    console.log(data);

                    var fd = new FormData();

                    fd.append( "Applications[image]", $("#Applications_image")[0].files[0]);

                    $.ajax({

                    url: "/applications/save",

                    type: "POST",

                    cache: false,

                    data: fd,

                    processData: false,

                    contentType: false,

                    success: function (data) { 

                    console.log(data);

                    },

        

                });

                }',

            ), array(

                'id' => 'applications-form_submit_' . rand(1, 255),

            ));?>



Собственно говоря делаем аякс запрос на сохранение файла например когда у нас нет ошибок. Так работает и получаем $_FILES в нашем actionSave().

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

Хотелось бы таки услышать методы реализации еще от когото.