Добрый день! Проблема следующая - осуществляю загрузку изображений на сайте пользователем. Само собой для загружаемого элемента существуют некоторые ограничения - расширение файла, вес, размер. Хочу сделать что бы посетитель видел отчет по каждой из причин если они возникли, то есть "Недопустимый тип"файла, "Превышен максимальный размер" и т.д. Форма выглядит таким образом: HTML: <form id="feeds" method="post" action="<?php echo base_url(); ?>feeds/add_feeds" enctype="multipart/form-data"> <input type="text" placeholder="Заголовок статьи" name="title" /> <input type="text" placeholder="Ключ статьи" name="key_n" /> <textarea placeholder="Текс статьи" name="txt" rows="10"></textarea> <input type="file" name="userfile" /> <button type="submit" class="button--8">ОПУБЛИКОВАТЬ</button> </form> Сервер: PHP: function add_feeds() { $config['upload_path'] = './library/img/news/'; $config['allowed_types'] = 'gif|jpg|png|jpeg'; $config['max_size'] = '100'; $config['max_width'] = '1024'; $config['max_height'] = '768'; $config['encrypt_name'] = TRUE; $config['remove_spaces'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload()){ $error = array('error' => $this->upload->display_errors()); $this->load->view('pages/feeds/index', $error); }else{ $image_data = $this->upload->data(); $feeds['title'] = $_POST['title']; $feeds['txt'] = $_POST['txt']; $feeds['key_n'] = $_POST['key_n']; $feeds['img'] = $image_data['file_name']; $this->main_model->new_feeds($feeds); echo json_encode($feeds); } } Сервер написан на php-фреймворке Codignaiter, обработка и отображение ошибок происходит вот в этой части кода: PHP: if ( ! $this->upload->do_upload()){ $error = array('error' => $this->upload->display_errors()); $this->load->view('pages/feeds/index', $error); } Для того что бы ошибка отображалась на страницу добавляю вот это: PHP: <?php if (isset($error)) {?> <?php echo $error;?> <?php }?> И если на форму не вешать аякс, что бы отправка на сервер происходила обновлением страницы, то вывод ошибок будет работать, а вот если повесить аякс, то нет... Конечно, в скрипте можно вывести какой-то allert с ошибкой типа "Что-то пошло не так", но это не совсем то что я хочу, обработчтк выглядит так: Код (Javascript): $("form#feeds").submit(function(e){ e.preventDefault(); var f = this, form = new FormData(this), s = $(f.elements).last(), e = s.end().slice(0, -2).removeClass('input-error').filter(function() { return !$.trim(this.value) }); if(e.length) e.addClass('input-error'); else { s.prop('disabled', 1); s.end().not(s); $.ajax({ url: f.action, type: 'POST', data: form, contentType: false, processData: false, cache: false, dataType: 'json', success: function(data) { f.reset(); s.prop('disabled', 0); e.removeClass('input-error'); $("#content").load("feeds #content"); }, error: function() { // здесь вывести ошибку } }); } }); Я догадываюсь что мне каким-то образом нужно вывести вот это: PHP: <?php if (isset($error)) {?> <?php echo $error;?> <?php }?> здесь: Код (Javascript): error: function() { // здесь вывести ошибку } Но, как это сделать я не понимаю, и не могу найти адекватного ответа в интернете, прошу помочь, словом или делом))
А в чем, собственно, проблема? Ты не знаешь, как аяксу ответ отдать, или что? Серверу плевать, кто его спрашивает. Он так же отдает ответ. Тебе надо просто его обработать. Отдавай в виде JSON, тогда любую структуру данных без проблем упакуешь-распакуешь.
Для сервера запрос от аякса - это такой же запрос от браузера. Он его просто обрабатывает. И просто отдает в ответ. То есть у тебя в аякс приходит тот текст, что ты выплюнешь с сервера. Если это HTML, то там HTML. Но так не советую делать. Тебе лучше отдавать JSON с ошибкой, описанием и тд, а там уже доставать это значение на стороне JS и на страницу втыкать.
Извини за туговатость, но у меня с синтаксисом еще плоховато из-а недостатка опыта, не мог бы помочь мне разобраться? Из того что ты сказал, я переделал скрипт на сервере вот таким образом: PHP: function add_feeds() { $config['upload_path'] = './library/img/news/'; $config['allowed_types'] = 'gif|jpg|png|jpeg'; $config['max_size'] = '500'; $config['max_width'] = '1024'; $config['max_height'] = '768'; $config['encrypt_name'] = TRUE; $config['remove_spaces'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload()) exit (json_encode($error = array('error' => $this->upload->display_errors())));{ $this->load->view('pages/feeds/index', $error); }else{ $image_data = $this->upload->data(); $feeds['title'] = $_POST['title']; $feeds['txt'] = $_POST['txt']; $feeds['key_n'] = $_POST['key_n']; $feeds['img'] = $image_data['file_name']; echo json_encode($feeds); $this->main_model->new_feeds($feeds); } } Не уверен что сделал правильно..., но в любом случаи не совсем понимаю как обработать результат в аяксе, опять же с синтаксисом разобраться не могу(
Тогда я тебе помочь не смогу. Синтаксис растолковывать, увы, у меня особо времени нет. Но могу дать совет - прежде чем вслепую сразу воротить что-то сложное, найди инфу по этому поводу, и собери что-нибудь простенькое, чтобы понимание пришло. Ну там..аяксовый скриптик, который раз в секунду обновляет циферку на экране. Пойми как это работает, и поймешь, как тебе сделать что-то сложное.
Все не на столько плохо, я понимаю как работает аякс. До меня не как не дойдет, как условие правильно написать на сервере и как принять результат в error моего аякса, я просто банально с этим некогда не работал, даже не знаю как так вышло, но вышло. Я не прошу делать за меня или учить меня синтаксису, я просто не где не могу найти нормальную информацию, по моей проблеме. Если ты понимаешь что нужно, но нет времени объяснить или показать, скинь пожалуйста хоть материал какой-то - был бы невероятно благодарен
Вот и поработайте, на примере чего-то элементарного. Чтобы было не только теоретическое понимание, но и понимание механики процесса. Попробуйте один из примеров, лучше первый, с таймером. Он крайне наглядный. И сразу поймете, что вам делать дальше.
наверное как-то так: Код (Javascript): error: function() { $("#result").text('некая ошибка'); //показываем ошибку на странице, например в <p id="result"></p> }
Нет. Ни то ни то. error - это если произошла реальная ошибка. Ошибка же автора приходит с кодом 200, это вполне корректный ответ сервера. Это не ошибка выполнения или запроса, это просто серверу не нравится контент, который ему передали. Результат этого запроса будет передан в success.
Ну он же получает данные в data, туда и передавать данные, типа Код (Javascript): if(data.myerror) $("#result").text(data.myerror);
Вы предлагаете ему делать это в обработчике error:function(), это неправильно и не будет работать. Код обработки должен быть в success:function(data);
Код обработки не обязательно должен быть в success:function(data) - То что ТС хочет сделать посредством php (существуют ограничения на расширение файла, вес, размер), можно проверить на js до отправки запроса через ajax
Безусловно. И можно и нужно. Больше предварительной валидации на клиенте - меньше холостых запросов к серверу. Но он хочет именно так. У него уже есть инфраструктура для этого, просто хочет синхрон на асинхрон поменять. Знаний JS нет. Есть знание жиквери-копипасты, но условное. Потом подрастет в плане навыков, перепишет по-правильному.
Спасибо за столь активное внимание к моей теме) Дело на самом деле не в бездумном копипасте кодов джейквери. Просто есть такая штука как опыт, его мне вчера и не хватило, сегодня пол дня посидел и разобрался, вдруг кому нужно будет вот что вышло: PHP: // Условие в обработчике на сервере if ( ! $this->upload->do_upload()){ echo json_encode($error = array('error' => $this->upload->display_errors())); }else{ $image_data = $this->upload->data(); $feeds['title'] = $_POST['title']; $feeds['txt'] = $_POST['txt']; $feeds['key_n'] = $_POST['key_n']; $feeds['img'] = $image_data['file_name']; $this->main_model->new_feeds($feeds); echo json_encode($feeds); } Код (Javascript): // Обработка полученного $error на клиенте success: function(data) { if(data.error) { alert(data.error); }else{ alert('ВСЕ ОК'); } }); А проверяю я коректность отправляемого файла не на клиенте, не потому что делать нечего или не знаю как это сделать, а просто так уж вышло что в начале своего "пути" связался с фреймворком Codignaiter, а у этого засранца свои методы обработки и загрузки файлов, приходиться к ним приспосабливаться. Всем спасибо, тема закрыта ))
А никто не говорит, что не надо ничего проверять на сервере. Надо, еще как. Обязательно надо. Мало ли кто и что будет нам пытаться загрузить, не используя браузер. Заливание шелла под видом картиночки - это ж классика. НО...при этом никто не мешает первичную проверку проводить на клиенте. Это благо для всех. 1) Клиент сразу узнаёт, что что-то не так. Ему не надо ждать, пока файл загрузится и прожуется сервером. Жители отдаленных регионов и севера скажут огромное спасибо. 2) Серверу не надо впустую грузить файлы и проверять их. Да, все равно могут валидацию отключить на клиенте и сунуть всякое, но...это один из тысячи. И тут серверная проверка отработает как надо. А остальные 999 из тысячи некорректных запросов и вовсе не дойдут до сервера. Пусть он лучше тратит свои ресурсы на полезную нагрузку.
Спасибо конечно) я это обязательно учту, хотя я это все и раньше знал/понимал, но повторение -мать учение, по этому спасибо что не поленился написать это разъяснение. Вопрос просто изначально не в целесообразности валидации на сервере был, а в том как ошибку при этой самой валидации показать клиенту
Понятное дело, но мы же беседуем. Беседа дошла до проблемы валидации, которой не все уделяют должное внимание. Более того, твоя серверная валидация с аяксом никак не исключает клиентскую поверх. Для пользователя будет выглядеть одинаково, если одинаково обыграешь в коде.