php загруженное имя файла слаг - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь изменить имя загруженного изображения. Название файла изображения на турецком, например, Şömine.jpg, и я пытаюсь сохранить его как Somine.jpg НО str_replace не работает.

Вот мой код тестирования и результаты;

$img=pathinfo($_FILES['image']['name'], PATHINFO_FILENAME);
echo $img.PHP_EOL;
$turkce=array("ö","Ş");
$duzgun=array("o","S");
$img=str_replace($turkce,$duzgun,$img);
echo $img.PHP_EOL;

$img1 = "Şömine";
$turkce=array("ö","Ş");
$duzgun=array("o","S");
$img1=str_replace($turkce,$duzgun,$img1);
echo $img1.PHP_EOL;

А на выходе;

Şömine
Şömine
Somine

Everyting имеет кодировку UTF-8, что я могу попробовать исправить? Как вы можете видеть, если я набираю текст в источнике работает нормально, но при загрузке файла это не работает. Есть идеи?

Ответы [ 4 ]

3 голосов
/ 27 июля 2011

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

Гораздо лучшим подходом было бы создание уникального хэша для каждого загруженного файла и его сохранение в базе данных вместе с настоящим именем файла.

Другими словами, если вы решили загрузить файл с именем Şömine.jpg после загрузки, вы не сохраняете его с его оригинальным именем, а вместо этого генерируете для него уникальный md5 (в данном случае ecc3a7d1bdd36b0849ab609857351cd1) и сохраните файл под именем ecc3a7d1bdd36b0849ab609857351cd1.jpg.

После этого вы просто добавляете в свою базу данных запись, указывающую, что ecc3a7d1bdd36b0849ab609857351cd1 фактически представляет файл с именем «Şömine.jpg».

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

header("Content-Disposition: attachment; filename=FILENAME_FROM_THE_DATABASE");
1 голос
/ 27 июля 2011

Есть более удобный способ взаимодействия с кодировкой символов в php, используя mb_convert_encoding. В этом случае вы можете сделать что-то вроде

$img = pathinfo($_FILES['image']['name'], PATHINFO_FILENAME);    
$new_name = mb_convert_encoding($img,'HTML-ENTITIES','UTF-8');
$new_name = preg_replace(
    array('/ß/','/&(..)lig;/',
         '/&([aouAOU])uml;/','/&(.)[^;]*;/'),
    array('ss',"$1","$1".'e',"$1"),
    $img);

echo $new_name;
0 голосов
/ 25 апреля 2012
  1. Сначала необходимо определить кодировку имени файла, полученного из формы. Правило простое: браузеры всегда используют одну и ту же кодировку исходной формы, поэтому, если форма была в кодировке UTF-8, для имени файла будет использоваться одна и та же кодировка.

  2. Во-вторых, если вы действительно хотите сохранить загруженный файл в файловую систему сервера, вы должны преобразовать кодировку в текущий языковой стандарт, заданный параметром LC_CTYPE (подробности см. В set_locale ()). В Windows этот параметр имеет вид

    language_country.codepage

где «кодовая страница» - это число, указывающее кодовую страницу Windows, настроенную в данный момент. Двумя примерами могут быть 1252 (западные страны, очень похожие на ISO-8859-1 или латинский 1) или 932 (японский). Затем вы должны перевести $ fn из его кодировки (скажем, UTF-8) в локальную кодировку (скажем, 1252) перед сохранением файла с этим именем. Некоторые символы могут не иметь соответствующего перевода в текущей локали, поэтому вы должны либо сообщить об ошибке, либо молча отбросить недопустимые символы; это только одна из причин, по которой сохранение файлов с их исходным именем, предоставленным удаленным пользователем, всегда очень плохая идея.

Более подробную информацию о поддержке PHP для имен файлов Unicode можно найти в моем ответе на ошибку PHP №. 47096 доступно по адресу:

https://bugs.php.net/bug.php?id=47096

0 голосов
/ 27 июля 2011

Возможно, вы захотите использовать этот отказоустойчивый метод utf-8 из Nette Framework http://api.nette.org/2.0/source-Utils.Strings.php.html#128

...