我在写magento一个上传文件模块的时候,发现当我将文件名命名为中文时,存储的文件居然为 file.jpg .
虽然在数据库里面,显示正常,读取数据库也是正常的,但是当读取实际文件(按上传的定义的文件名)时,“ not found !”
几经辗转,问题定位到 var/file/uploader.php 文件中 getCorrectFileName 函数
代码如下:
-
static public function getCorrectFileName($fileName)
-
{
-
-
$fileName = preg_replace('/[^a-z0-9_\\-\\.]+/i', '_', $fileName);
-
$fileInfo = pathinfo($fileName);
-
-
if (preg_match('/^_+$/', $fileInfo['filename'])) {
-
$fileName = 'file.' . $fileInfo['extension'];
-
}
-
return $fileName;
-
}
将函数修改为
-
static public function getCorrectFileName($fileName)
-
{
-
-
$fileName = preg_replace('/[^a-z0-9\x{4e00}-\x{9fa5}_\\-\\.]+/ui', '_', $fileName);
-
-
$fileInfo = pathinfo($fileName);
-
-
if (preg_match('/^_+$/', $fileInfo['filename'])) {
-
$fileName = 'file.' . $fileInfo['extension'];
-
}
-
return $fileName;
-
}
问题得以完美解决!
$fileName = preg_replace('/[^a-z0-9\x{4e00}-\x{9fa5}_\\-\\.]+/ui', '_', $fileName);
注意 红色加粗的代码,那一行代码是关键,正则表达式
'/[\x{4e00}-\x{9fa5}]+/u/' 就是匹配中文的正则,\x{nnnn} 表示字符的十六进制形式,更多信息查看php手册,请特别注意模式修饰符 u, php手册中说 u启用一个pcre中的peal不兼容的额外功能,该模式字符串被当成UTF8,改修饰符在UNIX系统中自 php 4.1启用。另:在 utf8环境中用元字符匹配字符串最好加上修饰符 u,经验之谈。(责任编辑:好模板) |