【问题标题】:Broken Cyrillic file name when uploading to server上传到服务器时损坏的西里尔文文件名
【发布时间】:2014-01-28 12:31:25
【问题描述】:

我有这个php函数:

function upload_file($f,$fn){
switch($f['type']){
case 'image/jpeg':$image = imagecreatefromjpeg($f['tmp_name']);break;
case 'image/png':case 'image/x-png':move_uploaded_file($f['tmp_name'],'../images/pc/'.$fn.'.png');break;
case 'image/pjpeg':$image = imagecreatefromjpeg($f['tmp_name']);break;
echo $f['type'],'<br />';
}
if(!empty($image)) imagejpeg($image,'../images/pc/'.$fn.'.png');
}    

其中 $fn = "нова-категория" 但是当我将重命名的文件上传到服务器时 - 图像名称已损坏,如下所示: РЅРѕРІР°-РєР°С,егория.png

有趣的是,如果我尝试访问服务器上的图像:site.com/images/pc/нова-категория.png => 我可以看到图像.. 你能告诉我是什么让图像名称看起来正常吗?

【问题讨论】:

  • 嘿,我正在删除我的答案,因为它不能解决您的问题,并且没有答案的帖子将获得更多可见性。我仍在监视线程,只要你用@Matt 通知我,我会继续努力帮助你。

标签: php image upload cyrillic


【解决方案1】:
  1. 当您使用 ftp 客户端浏览 ftp 时,您会看到 ANSI 编码的名称(单字节编码)。在这种情况下,РЅРѕРІР°-категория.png 实际上是 UTF-8(双字节)编码的нова-категория.png

  2. 当您将文件上传到网络服务器时,浏览器会将文件名中的非 unicode 符号转换为 UTF-8(нова-категория.png 变为 РЅРѕРІР°-категория.png

  3. 当您再次请求 site.com/images/pc/нова-категория.png 时,浏览器将非 unicode 符号转换为 UTF-8,服务器实际上会查找 РЅРѕРІР°-категория.png(在 ASCI 编码中)。

因此,如果您想在 ftp-client 中看到“正常”名称,您应该将它们转换为您的本机编码

function upload_file($f,$fn){
$fn=iconv("UTF-8","Windows-1251",$fn);
switch($f['type']){
...

但在这种情况下,您的文件的 URL 会出现问题。 要将正确的 URL 写入 ANSI 编码的名称,您应该使用以下 php 代码:

echo "site.com/images/pc/".rawurlencode("нова-категория.txt");

您应该如何处理文件名取决于您对这些文件的使用。 但我不建议您转换它们。如果您有问题,我认为不是“损坏”的名称。

【讨论】:

    最近更新 更多