Загрузка изображения - проблема латинских букв - PullRequest
0 голосов
/ 26 ноября 2009

Я использую этот скрипт для загрузки изображений в serveR:

 <?php

if (($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg"  && ($_FILES["image_upload_box"]["size"] < 2000000))
    {

        $max_upload_width = 450;
        $max_upload_height = 450;
        if(isset($_REQUEST['max_width_box']) and $_REQUEST['max_width_box']!='' and $_REQUEST['max_width_box']<=$max_upload_width){
            $max_upload_width = $_REQUEST['max_width_box'];
        }    
        if(isset($_REQUEST['max_height_box']) and $_REQUEST['max_height_box']!='' and $_REQUEST['max_height_box']<=$max_upload_height){
            $max_upload_height = $_REQUEST['max_height_box'];
        }   
        if($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg"){    
            $image_source = imagecreatefromjpeg($_FILES["image_upload_box"]["tmp_name"]);
        }       

        $remote_file =$directory."/".$_FILES["image_upload_box"]["name"];
        imagejpeg($image_source,$remote_file,100);
        chmod($remote_file,0644);

        list($image_width, $image_height) = getimagesize($remote_file);

        if($image_width>$max_upload_width || $image_height >$max_upload_height){
            $proportions = $image_width/$image_height;

            if($image_width>$image_height){
                $new_width = $max_upload_width;
                $new_height = round($max_upload_width/$proportions);
            }       
            else{
                $new_height = $max_upload_height;
                $new_width = round($max_upload_height*$proportions);
            }       


            $new_image = imagecreatetruecolor($new_width , $new_height);
            $image_source = imagecreatefromjpeg($remote_file);

            imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);
            imagejpeg($new_image,$remote_file,100);

            imagedestroy($new_image);
        }

        imagedestroy($image_source);



    }else{
       something....
    }

?>

Это хорошо работает, пока я не загружу фотографию с латинскими буквами в имени файла. Например, имя файла: kék hegyek.jpg. После загрузки имя файла будет: KĂ © k hegyek.jpg

Как я могу решить это?

Спасибо

Ответы [ 4 ]

0 голосов
/ 26 ноября 2009

Я изменяю код, как вы предложили: Это всего лишь фрагмент:

   $remote_file =$directory."/".$_FILES["image_upload_box"]["name"];
   $remote_file=utf8_decode($remote_file);
   imagejpeg($image_source,$remote_file,100);
   chmod($remote_file,0644);

Хорошо, теперь, после загрузки изображения, имя файла правильное: Kék hegyek.jpg

Эта часть моего кода, я читаю все изображения из каталога и перечисляю их:

  $images = glob("" . $directory . "*");
     $imgs = '';
     foreach($images as $image){ $imgs[] = "$image"; }
     $imgs = array_slice($imgs, 0, 20);
     foreach ($imgs as $img) {
  //  $img=utf8_decode($img); 
     echo  "<form action='datasheet_edit.php' id='$img' method='post'>";
     echo "<div class=\"photo\">"; 
     echo "<img  src='$img' width='100' height='50%' alt=\"\"><br>\n"; 
     echo "<a href=\"$img\">",basename($img),"</a><br>\n</div>"; 
     echo "<input type='hidden' id='fordelete' name='fordelete' value='$img' />";
     echo "</div>\n"; 
     echo "</form>";
     }

Это хорошо работает, но указанное имя файла неверно: K :k hegyek.jpg Я попытался использовать UTF8_DECODE здесь (без комментариев), но так получилось: K? hegyek.jpg

После этого я попытался использовать UTF8_ENCODE и вуаля, вывод: Kék hegyek.jpg

Но, к сожалению, часть кода ссылки неверна, потому что ссылка: http://localhost/page/Kék%20hegyek.jpg.

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

Unlink ($ файла);

Имя файла: Kék hegyek.jpg, а не Kék% 20hegyek.jpg, поэтому я не могу его удалить.

Я схожу с ума ...

Окончательное решение для меня:

  1. В удаленном файле заменить "пробел" на "_"
  2. Тогда $ remote_file = utf8_decode ($ remote_file);
  3. При выводе имени файла $ img = utf8_encode ($ img);
  4. А когда нажмите, чтобы удалить: unlink (utf8_decode ($ _ POST ['fordelete']));

Это решение - работа для меня. Я думаю, что не лучший способ декодировать-кодировать-декодировать - да, но это нормально для меня.

0 голосов
/ 26 ноября 2009

Ваша страница в UTF-8, но сервер на латинице-1. Вы должны сделать их одинаковыми.

0 голосов
/ 26 ноября 2009

На каком сервере это работает? Это выглядит очень похоже на то, что у вас есть форма в кодировке UTF-8, но имя файла где-то по пути меняется на латинский - возможно, когда файл записывается в файловую систему. Вот почему важно знать, на каком сервере / операционной системе вы работаете. В конце концов, дело в используемой файловой системе.

Если файловая система вашего сервера не поддерживает UTF-8, вы можете попробовать использовать utf8_decode () или iconv () для преобразования имени в правильный набор символов.

Вы также можете подумать об удалении нелатинских символов. Чаще всего это самый простой способ, я делаю это все время с умлаутами.

Это общее хорошее прочтение о кодировках: Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Юникоде и наборах символов (без оправданий!)

0 голосов
/ 26 ноября 2009

Обычно это относится к базовой файловой системе.

Какая файловая система у вас под этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...