1

我有一个“困境”,想知道什么是商业最佳实践。

我正在使用 Uploadify 上传图片。现在我需要在保存文件之前验证文件名。

我查看了不同的解决方案,但无法找到一种好的解决方案。

这是我的标准:

  • 文件名必须全部小写
  • 文件名只能包含字符 [a-z0-9_-]
  • 我必须能够重命名文件

如果文件名是 ,你会怎么做my.file(name).jpeg

我可以在 '.' 上分解文件名。并保存扩展名,然后再次内爆以获取文件名。但不确定这是否是最好的解决方案。

我有以下功能有点帮助:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

更新 1
我通过 $_FILES 接收文件。这给了我以下数据:

  • $_FILES["file"]["name"] - 上传文件的名称
  • $_FILES["file"]["type"] - 上传文件的类型
  • $_FILES["file"]["size"] - 上传文件的字节大小
  • $_FILES["file"]["tmp_name"] - 存储在服务器上的文件的临时副本的名称
  • $_FILES["file"]["error"] - 文件上传产生的错误代码

更新 2
我刚刚发现了一些东西。我可以使用getimagesize它将返回一个包含 7 个元素的数组。这些元素之一 [2] 是 IMAGETYPE_XXX。

所以我尝试使用这段代码:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

但它只返回数字 2...

(我也尝试使用 exif_imagetype,但它只得到PHP Error: Call to undefined function。)

4

5 回答 5

4

使用正则表达式检查文件名。使用有关 mimetype 的信息。使用 md5 名称将文件保存在服务器上。将真实文件名存储在 db 上。

于 2009-12-08T22:52:20.193 回答
3

pathinfo()可以获得文件名和扩展名。但是,我会警告您,您不能依赖通过检查文件名来测试文件的扩展名。您将需要使用一个函数来实际检查文件的二进制内容。finfo_file()可以做到这一点。哦,在用户提供的文件路径上使用basename()来防止路径遍历攻击永远不会有坏处。

于 2009-12-08T22:52:52.797 回答
0

这应该做你想做的一切:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

正如 Pekka 解释的那样,如果您想替换文件名中的所有重音符号,您可以使用以下函数:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
于 2009-12-08T22:55:52.263 回答
0

我假设您正在验证文件名以供以后用作下载文件名。

虽然为了用户的利益而保留文件名会很好,但从技术角度来看,您的方法听起来不错。

如果您关心 URL 的外观,并且将来可能针对国际受众,请务必将 Umlauts 转换为它们的基本字符或转换它们。德国用户 (Umlauts Ä Ö Ü ß) 期望转换:

Ä = ae
Ö = oe
Ü = ue

而斯堪的纳维亚人似乎对

Ä => a
Ö => o
Ø => o

等等。

然后是各种重音字符 é á ó...

完全删除这些会导致在 bwsr 地址 br中看起来真的是bd 和 lok strng 的 URL。

于 2009-12-08T22:50:31.150 回答
0

我认为您不应该“验证”文件名,如果它不是您想要的格式,您应该“修复”它。为什么仅仅因为某人不擅长命名他们的文件,或者其中有一些不寻常的字符就拒绝一个文件?此外,如果您正在使用图像,则可以getimagesize按照您提到的那样使用以确保它实际上是上传的图像(如果不是图像,则应该失败)。

于 2009-12-08T23:36:23.397 回答