За последние 24 часа нас посетили 32794 программиста и 1820 роботов. Сейчас ищут 863 программиста ...

Файл загрузился, но скрипт все равно возвращает error

Тема в разделе "PHP для новичков", создана пользователем smartCreate, 9 фев 2017.

  1. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Доброго всем утра! Проблема следующего характера:

    1) Есть форма всего с одним импутом для загрузки изображений:

    HTML:
    1.  
    2. <form id="add_img-small" method="post" action="../admin_c/add_img_small" enctype="multipart/form-data">
    3.       <div class="file-upload">
    4.               <label>
    5.                       <input type="file" name="file[]" multiple="true" />
    6.                       <span><i class="fa fa-picture-o" aria-hidden="true"></i></span>
    7.               </label>
    8.        </div>
    9.        <button type="submit" data-active="submit" class="hidden"></button>
    10. </form>
    11.  
    2) Есть аякс для обработки этой формы:

    Код (Javascript):
    1. $('#add_img-small [type=file]').change(function(){
    2.          
    3.        $("form#add_img-small").each(function(){
    4.                 var f = this,
    5.                       form = new FormData(this);
    6.                    
    7.                 $('.error_success').fadeIn(500);
    8.                 $('#preloader').append( $('.preloader') );
    9.                 $('.preloader').show();
    10.                
    11.                 $.ajax({
    12.                     url: f.action,
    13.                     type: 'POST',
    14.                     data: form,
    15.                     contentType: false,
    16.                     processData: false,
    17.                     cache: false,
    18.                     dataType:"json",
    19.                     success:function(data){
    20.                         if(data.error) {
    21.                             $('.preloader').fadeOut(500, function() {
    22.                                 $(".error_success #error").html(data.error);
    23.                             });
    24.                         }else{
    25.                             $('.preloader').fadeOut(500, function() {
    26.                                 $(".error_success #success").html(data.success);
    27.                             });
    28.                         }
    29.                     },
    30.                     error: function(data) {
    31.                         console.log(data);
    32.                     }
    33.                 })
    34.             });
    35.            
    36.         });
    3) Контроллер на сервере:
    PHP:
    1. function add_img_small() {
    2.         $config['upload_path'] = './upload/image/small';
    3.         $config['allowed_types'] = 'png';
    4.         $config['max_size']    = '100';
    5.         $config['max_width'] = '500';
    6.         $config['max_height'] = '500';
    7.         $this->load->library('upload', $config);
    8.        
    9.         $this->upload->initialize($config);
    10.            
    11.         $temp_files = $_FILES;
    12.         $count = count ($_FILES['file']['name']);
    13.         for ($i=0; $i<=$count-1; $i++) {
    14.             $_FILES['file'] = array (
    15.                 'name'=>$temp_files['file']['name'][$i],
    16.                 'type'=>$temp_files['file']['type'][$i],
    17.                 'tmp_name'=>$temp_files['file']['tmp_name'][$i],
    18.                 'error'=>$temp_files['file']['error'][$i],
    19.                 'size'=>$temp_files['file']['size'][$i]
    20.             );
    21.             if ( ! $this->upload->do_upload('file')){
    22.                 echo json_encode($error = array('error' => $this->upload->display_errors('<p><i class="fa fa-exclamation-triangle" aria-hidden="true"></i><br>', '</p>')));
    23.             }else{
    24.                 echo json_encode($success = array('success' => '<p><i class="fa fa-check-square-o" aria-hidden="true"></i><br>Изменения успешно внесены</p>'));
    25.             }
    26.            
    27.         }
    28.     }
    P.S. Работаю на фреймворке Codignaiter

    Как видите из выше написанного, эти скрипты не просто загружают файл на сервер, но валидируют загружаемые изображения.

    Проблем при загрузке одного изображения нет не каких, скрипт на сервере все проверяет и возвращает через json_encode клиенту массив $success если все 'ок', либо $error если загружаемый файл не соответствует мои требованиям, а дальше в аяксе я показываю уведомление о успехе или ошибке загрузки клиенту, вот так:

    Код (Javascript):
    1. success:function(data){
    2.         if(data.error) {
    3.                $('.preloader').fadeOut(500, function() {
    4.                       $(".error_success #error").html(data.error);
    5.                });
    6.          }else{
    7.                $('.preloader').fadeOut(500, function() {
    8.                          $(".error_success #success").html(data.success);
    9.                 });
    10.          }
    11. }
    Еще раз повторюсь, если загружаю одно изображение, то все срабатывает как нужно, и валидация и уведомления!

    А вот когда загружаешь несколько изображений начинаются проблемы. Порядок такой:

    1) Валидация срабатывает;
    2) Если все ок, то файлы загружаются, но:
    - ответ от сервере приходит уже ошибкой, то есть не в success моего аякса, а в error;
    - на ошибку нечего не указывает, json_encode возвращает именно $success;
    - ответ от сервера с кодом 200, что еще раз говорит что все было ок.
    3) Если валидация запорола файлы, они не загружаются, но (опять таки):
    - ответ от сервере приходит уже ошибкой, то есть не в success моего аякса;
    - да скрипт возвращает массив $error с ошибкой, но она должна его вернуться в success, где я обработаю её через:
    Код (Javascript):
    1. if(data.error) {
    2.        $('.preloader').fadeOut(500, function() {
    3.                $(".error_success #error").html(data.error);
    4.        });
    5. }
    а сервер говорит что это все таки error, хотя и ответ 200.

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

    Искренне прошу помощи)
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    поверх функции php сделай отладку
    PHP:
    1. <?php
    2.  
    3. var_export ( $_FILES );
    мне нужен результат, ввиде массива
     
  3. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    полученный массив:

    Код (Javascript):
    1. {"file":{"name":"ico1.png","type":"image\/png","tmp_name":"\/home\/users2\/r\/ru-marketroll\/tmp\/phpw6yoqh","error":0,"size":24431}}{"file":{"name":"ico2.png","type":"image\/png","tmp_name":"\/home\/users2\/r\/ru-marketroll\/tmp\/php7XtlZg","error":0,"size":24431}}
     
    #3 smartCreate, 9 фев 2017
    Последнее редактирование модератором: 9 фев 2017
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate может надо if(data.error!=null) или !=0
     
  5. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Я был бы рад, если бы все было так просто, но увы нет(

    Дело не в способе проверки в js, вообще не имеет значение что я напишу в success, сервер все равно вернет error...
    --- Добавлено ---
    Друзья, тема все еще актуальна, даже очень! Пожалуйста обратите свое внимание, очень нужна помощь
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    ты мне export должен был показать обернутый в array (), а не json левый сдернутый с какого то места.
    Сам скрипт вообще бред, он не работает с глобальной переменной $_FILES, левые настройки, цикл который 100500 раз перезаписывает один и тот же массив с ключем files.
     
  7. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    бл*, сори, запаролся, на ровном месте, не особо внимательно прочитал тебя в тот раз, просто вообще(

    вот то что ты просил:

    Код (Text):
    1. array (
    2.   'file' =>
    3.   array (
    4.     'name' => '9 — копия.jpg',
    5.     'type' => 'image/jpeg',
    6.     'tmp_name' => '/home/users2/r/ru-marketroll/tmp/phpkVJIoH',
    7.     'error' => 0,
    8.     'size' => 16360,
    9.   ),
    10. )array (
    11.   'file' =>
    12.   array (
    13.     'name' => '9.jpg',
    14.     'type' => 'image/jpeg',
    15.     'tmp_name' => '/home/users2/r/ru-marketroll/tmp/phpswIQBe',
    16.     'error' => 0,
    17.     'size' => 16360,
    18.   ),
    19. )
    --- Добавлено ---
    На всякий уточню, оба файла успешно загрузились, как и всегда, но error не куда не девается(
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    Вооо отлично, супер!
    А теперь по порядку, что именно твой контроллер код делает ? какую функцию выполняет ? я вот смотрю и туплю, суть кода не улавливаю. + что в еррор пишет , какая ошибка ?
     
  9. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Смотри, в codignaiter есть своя библиотека которая занимается загрузкой файлов, в скрипте который я написал выше мы:
    1) передаем ей определенные параметры для загружаемых файлов;
    2) отправляем массив с указанными параметрами в библиотеку которая занимается загрузкой;
    3) подключаемся к библиотеке, вытягиваем из нее массив FILES к которому уже применились параметры указанные в массиве config
    4) дальше делаем проверку:
    а) если библиотека Upload вернула ошибку, мы передаем её код через json клиенту;
    б) если ошибок не было, то Upload загрузит файлы в указанную папку и вернет через json сообщение что все прошло успешно

    В случаи с загрузкой одного файла все так и происходит, но в случаи множественной загрузки происходит бред:
    1) файлы загружаются, и если смотреть на процесс через нетвокр в консоли, то мы увидим что все проходит успешно и сервер json-ом возвращает что все ок, ошибок не было;
    2) не смотря на это в аяксе отрабатывается не success а error. И ошибки там в принципе нет не какой, просто я вручную задаю - если сервер вернул error, показать сообщения "Произошла ошибка, обновите страницу"