zzajeilo
(Wist1599)
October 21, 2013, 11:33pm
1
У меня задачка достать имя файла из 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); // массив пустой
}
Очень нужно получить имя файла в контроллере. Спасибо.
Ну, во-первых файлы через аякс грузятся сравнительно хреново, во-вторых, половина браузеров не любят отдавать данные по файлам джаваскрипту.
Полагаю, проблема где-то тут.
zzajeilo
(Wist1599)
October 21, 2013, 11:57pm
3
Ну, во-первых файлы через аякс грузятся сравнительно хреново, во-вторых, половина браузеров не любят отдавать данные по файлам джаваскрипту.
Полагаю, проблема где-то тут.
Мне загружать-то ничего не нужно, только имя файла серверу отослать. Если простого метода не найдется, придется модель создавать, и уже из модели вытягивать имя файла. А не хочется.
Спасибо.
tuschkan
(O Turansky)
October 22, 2013, 1:56am
4
передаваемые данные нужно serialize()
укажите ‘dataType’=> ‘json’, для CHtml::ajaxButton
ineersa
(Ineersa)
October 22, 2013, 6:39am
5
Тоже есть такая проблемка. Сейчас сделаю, напишу решение.
Ну, во-первых файлы через аякс грузятся сравнительно хреново, во-вторых, половина браузеров не любят отдавать данные по файлам джаваскрипту.
Полагаю, проблема где-то тут.
Если можно поподробнее - как реализовать тогда обработку формы с ajaxButton?
ineersa
(Ineersa)
October 22, 2013, 7:12am
6
Так совсем ничего не передается.
Массив 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 делать аякс запрос там где у нас выводятся уведомления об успешном сохранении?
У кого еще есть идеи как такое сделать?
ineersa
(Ineersa)
October 22, 2013, 7:29am
7
Собственно говоря получилось.
Итого что нам нужно - нужен 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().
Не рекомендую данный способ никому, особенно не вздумайте использовать для больших файлов. Пробуйте прикручивать аплоадеры, ну или расширения, мне достаточно такого, поэтому проще написать самому (да и всегда есть цель самообразования).
Хотелось бы таки услышать методы реализации еще от когото.