Удалить DOM UTF-8 в URL — JS и PHP

У меня проблема со "странными" символами в URL.

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

Вот мой js:

<script type="text/javascript">
$(document).ready(function() {
   $('#file_upload').uploadify({
     'height'    : 30,
     'width'     : 100,
     'buttonImg' : '<?=base_url()?>style/images/buttons/button_dodaj_gray.png',
     'cancelImg' : '<?=base_url()?>style/js/uploadify/cancel.png',
     'wmode'     : 'transparent',
     'onComplete': function(event, ID, fileObj, response, data) {
          if( response != "ERROR" )
          {
              var imageSrc = "";
              //imageSrc = "/ads_images_temp/";
              imageSrc = response;
              $('.image_container').html('<img src="<?=base_url()?>'+imageSrc+'"></img>');
          }
     },
     'fileExt'   : '*.jpg;*.jpeg;*.png;*.gif',
     'displayData': 'percentage',
     'multi'     : false,
     'uploader'  : '<?=base_url()?>style/js/uploadify/uploadify.swf',
     'script'    : '/tools/upload/product/glavna',

     'auto'      : true
   });
});
</script>

Проблема в строке: $('.image_container').html('<img src="<?=base_url()?>'+imageSrc+'"></img>');.

Я не получаю чистый URL-адрес изображения, но получаю это: %EF%BB%BF768f32dd43cc1f90b79c83cceed57eb2.png.

Имя файла: 768f32dd43cc1f90b79c83cceed57eb2.png

ОБНОВЛЕНИЕ: Мой файл PHP для чтения изображения:

if ( !empty($_FILES) )
            {
                $config['upload_path'] = $temp_path;
                $config['allowed_types'] = '*';
                $config['max_size'] = 4000;
                $config['encrypt_name'] = true;

                $this->load->library('upload', $config);
                $this->upload->initialize($config);

                if( ! ($this->upload->do_upload("Filedata"))) // Napaka pri nalaganju slike
                {
                    //echo $this->upload->display_errors('<p>', '</p>');
                    echo "ERROR";
                }
                else // Vse OK, nadaljuj
                {
                    $img = $this->upload->data();

                    if($img['image_width'] > 650)
                    {
                        $config['image_library'] = 'gd2';
                        $config['source_image'] = $img['full_path'];
                        $config['create_thumb'] = TRUE;
                        $config['maintain_ratio'] = TRUE;
                        $config['width'] = 650;

                        $this->load->library('image_lib', $config);

                        $this->image_lib->resize();
                    }

                    // Resize image    
                    $this->Product_model->resize_image($img['full_path'], $temp_path.'/crop_'.$img["raw_name"].$img["file_ext"], 160, 120);
                    $this->Product_model->resize_image($img['full_path'], $temp_path.'/crop_crop_'.$img["raw_name"].$img["file_ext"], 80, 60);

                    //$this->session->set_userdata("oddaja_oglasa_glavnaSlika",$img["raw_name"].$img["file_ext"]);

                    $imeSlike = $img["raw_name"].$img["file_ext"];

                    echo $imeSlike;
                }
            }

РЕДАКТИРОВАТЬ 2:

Скриншот консоли Chrome: http://imageshack.us/f/818/uploadifychromeconsole1.png/

С уважением, Марио


person Puzo    schedule 16.08.2011    source источник
comment
Как вы читаете изображение в PHP?   -  person andyb    schedule 16.08.2011
comment
@andyb: я обновил свой первый пост..   -  person Puzo    schedule 16.08.2011
comment
Используете ли вы в своем примере codeigniter.com/user_guide/libraries/file_uploading.html?   -  person andyb    schedule 16.08.2011
comment
@andyb: да, я использую эту библиотеку.   -  person Puzo    schedule 16.08.2011
comment
Извините, могу ли я увидеть вкладку Сеть в Chrome, чтобы увидеть запрос и ответ AJAX. Одна вещь, которую можно попробовать, — это создать тестовый PHP-файл, который просто возвращает простой echo и вместо этого вызывает его из uploadify; так что мы можем начать исключать вещи.   -  person andyb    schedule 16.08.2011


Ответы (2)


EF BB BF — это представление UTF-8 знака порядка следования байтов (BOM). Что-то сохраняет или возвращает данные в кодировке UTF-8 с необязательной спецификацией в начале.

Похоже, об этом сообщалось в загрузить форум.

Изменить

Итак, файл echo $imeSlike должен быть сохранен со спецификацией в качестве первых 3 байтов. Вам необходимо настроить редактор так, чтобы он не добавлял спецификацию при сохранении файлов PHP (или любого другого файла).

В качестве альтернативы, если вы используете Windows, отличным редактором для выделения таких проблем с кодировкой является EditPad (хотя есть много других, в которых можно настроить добавление спецификации). Вы можете отключить спецификацию в разделе Параметры. Или вы можете попробовать сохранить файл в кодировке ASCII, которая также удалит спецификацию. Однако, в зависимости от содержимого вашего PHP, это может быть непрактичным решением.

person andyb    schedule 16.08.2011
comment
Спасибо за быстрый ответ. Мой PHP-код: echo $img["name"]; Имя изображения зашифровано с помощью md5, поэтому в имени изображения нет странных символов... - person Puzo; 16.08.2011
comment
@Puzo: в текстовом редакторе снимите флажок «Сохранить спецификацию UTF-8» (как бы он ни назывался). - person Álvaro González; 16.08.2011
comment
Альтернативой OSS для EditPad является Notepad++. - person Boris B.; 16.08.2011
comment
@andyb: Спасибо за информацию и решение. Есть ли функция PHP, которая удаляет спецификацию из строки? Я уже ищу, но безуспешно.. - person Puzo; 16.08.2011
comment
Возможно, blog.philipp-michels.de/?p=32, но правильное решение заключается в том, чтобы просто сохранить файл PHP, который обрабатывает загрузку без спецификации. - person andyb; 16.08.2011
comment
Я только что попробовал эту функцию, но не повезло: function removeBOM($str=""){ if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { $str=substr($str, 3); } return $str; } - person Puzo; 16.08.2011
comment
@andyb: я только что открыл файл в EditPad Pro 7, сохранил его и загрузил обратно на сервер. В строке все еще есть спецификация... - person Puzo; 16.08.2011
comment
Вы сначала изменили параметр спецификации? Вы можете увидеть, присутствует ли спецификация, переключившись в шестнадцатеричный режим (Ctrl + H). Если первые 3 символа ef BB BF, то спецификация все еще добавляется. Опции -> Настройка типов файлов -> Кодировка (вкладка) -> снимите флажок Записать метку порядка следования байтов.... Затем повторно сохраните файл. - person andyb; 16.08.2011
comment
Нужно ли удалять спецификацию из файла только для обработки загрузки или из файла, в котором есть JS и HTML? Я даже открываю файл в Notepad ++, конвертирую в UTF-8 без спецификации и все равно ничего ... Когда я открываю файл в EditPad и переключаюсь в шестнадцатеричный режим, его не удается найти EF BB BF. В EditPad эта опция уже снята... - person Puzo; 16.08.2011
comment
Что такое сценарий /tools/upload/product/glavna? Спецификация находится в начале response, возвращающегося из этого сценария. - person andyb; 16.08.2011
comment
Это контроллер. upload — это контроллер, product — это метод, а glavna — это параметр. Это в файле upload.php. Этот скрипт обрабатывает процесс загрузки. - person Puzo; 16.08.2011
comment
Итак, upload.php является конечной точкой для uploadify, и именно этот файл отвечает именем файла. Вы полностью уверены, что у upload.php нет спецификации? Поскольку это единственная возможность, о которой я могу думать, кроме простого удаления первых 3 байтов в обратном вызове complete (что я не рекомендую, так как это может сломаться, если или когда спецификация будет правильно удалена). - person andyb; 16.08.2011
comment
Хорошо, в этом файле нет спецификации :-) Если это файл, который используется для загрузки, и нет ничего другого echoing перед именем файла, то у меня заканчиваются идеи! - person andyb; 16.08.2011
comment
Один echo был раньше, но это эхо в случае ошибки при загрузке файла на сервер.. Это echo проблематично? Да, этот файл используется... - person Puzo; 16.08.2011
comment
Последняя идея (пока). Можете ли вы открыть Консоль в Chrome и увидеть точный ответ, который возвращается обратно в JavaScript от upload.php? Не могли бы вы отредактировать вопрос и добавить какие-либо выводы/скриншоты, пожалуйста. Я предполагаю, что вы увидите BOM + имя файла в тексте ответа. - person andyb; 16.08.2011
comment
Я обновил свой первый пост... Я только что увидел в HTML, что: ďťż<!DOCTYPE html><head>. - person Puzo; 16.08.2011

Я нашел решение - JSON! :)

Эхо в PHP:

    $json = array("name" => $imeSlike, "error" => 0);
    echo json_encode($json);

In JS:

...
'onComplete': function(event, ID, fileObj, response, data) {
        eval("var obj1="+response);

        if( obj1.error == 0 )
        {
            $('.image_container').html('<img src="<?=base_url()?>ads_images_temp/crop_'+obj1.name+'"></img>');
        }
     },
...

Спасибо всем за ваше время и обмен решениями!

С уважением, Марио

person Puzo    schedule 16.08.2011