php上传文件名slug

时间:2011-07-27 17:07:20

标签: php utf-8 str-replace

我正在尝试更改上传图片的名称。 图像文件名是土耳其语,如Şö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 个答案:

答案 0 :(得分:3)

依靠文件系统来保存上传文件的名称特征,特别是那些包含UTF-8字符的文件,这是一个坏主意。

更好的方法是为每个上传的文件创建一个唯一的哈希值,并将其与文件的真实名称一起存储在数据库中。

换句话说,如果你决定在上传后上传一个名为Şömine.jpg的文件,你不会用它的原始名称存储它,而是为它生成一个唯一的md5(在这种情况下{ {1}})并将文件存储在名称ecc3a7d1bdd36b0849ab609857351cd1下。

之后,您只需向数据库添加一条记录,指示ecc3a7d1bdd36b0849ab609857351cd1.jpg实际上代表名为“Şömine.jpg”的文件。

当您需要检索文件时,只需在数据库中搜索名称,然后检索其名称中包含相应哈希的文件。之后,使用以下标题向用户显示带有其原始文件名的文件。

ecc3a7d1bdd36b0849ab609857351cd1

答案 1 :(得分:1)

使用mb_convert_encoding有更方便的方法与php中的字符编码进行交互。在这种情况下,您可以执行类似

的操作
$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;

答案 2 :(得分:0)

您可能希望在Nette Framework http://api.nette.org/2.0/source-Utils.Strings.php.html#128

中使用此utf-8故障安全方法

答案 3 :(得分:0)

  1. 首先,您必须确定从表单中检索的文件名的编码。规则很简单:浏览器总是使用与原始表单相同的编码,因此如果表单采用UTF-8编码,则文件名将使用相同的编码。

  2. 其次,如果您确实要将上传的文件保存到服务器的文件系统,则必须将编码转换为LC_CTYPE参数指定的当前语言环境(有关详细信息,请参阅set_locale())。在Windows上,此参数具有表单

    language_country.codepage

  3. 其中“codepage”是一个给出当前配置的Windows代码页的数字。两个例子可能是1252(西方国家,非常类似于ISO-8859-1 aka Latin1)或932(日本)。然后,在保存具有该名称的文件之前,必须将$ fn从其编码(例如,UTF-8)转换为本地编码(例如,1252)。某些字符可能在当前语言环境中没有相应的翻译,因此您必须发出错误信号或者无声地删除无效字符;这只是为什么用远程用户提供的原始名称保存文件总是一个非常糟糕的主意。

    有关PHP支持Unicode文件名的更多详细信息,请参阅我对PHP错误号的回复。 47096可从以下网址获得:

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