PHP:如何清理上传的文件名?

时间:2010-09-20 22:36:35

标签: php file-upload sanitization

我有一个PHP应用程序。

我允许用户将文件上传到我的网络应用程序。

问题:在PHP中清理上传文档$_FILES["filename"]["tmp_name"]的文件名的最佳方法是什么?

更新

我可以获取上传文件名的MD5并将其用作新分配的文件名吗?如果是这样,我如何在PHP中执行此操作?

6 个答案:

答案 0 :(得分:4)

我打赌你还会在数据库中存储一些关于该文件的信息。如果这是正确的,那么您可以使用主键(ID)作为服务器上的文件名,并在数据库中保留原始文件名。这为您提供了更大的灵活性,因为您可以在不重命名实际文件的情况下操作元数据。

答案 1 :(得分:2)

我只想运行一个简单的正则表达式,用下划线替换任何非字母数字字符(或者只删除这些字符)。确保保留课程的扩展名。

如果你想更进一步,可以使用magic mime扩展来确保文件格式与扩展程序所说的格式相同。

编辑:为避免目录中的文件名冲突,您可以将md5用户IP +当前时间附加到文件名。

答案 2 :(得分:2)

为避免文件名冲突,只需检查给定或生成的文件名是否已存在:

do {
   // Generate filename, eg.:
   $filename = md5(uniqid()) . $fileExtension;
} while (file_exists($filename));

这使您100%确定文件名是唯一的。使用md5(或任何其他哈希算法)可确保文件名是安全的 - 并且易于处理。

答案 3 :(得分:0)

不是清理用户指定的文件名,而是使用该照片的任何其他唯一标识符并将其存储为文件名。我更喜欢使用数字且始终唯一的用户ID。

move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

然后,您可以通过了解用户的ID从任何位置(例如,S3甚至您自己的服务器)获取图像。您甚至不需要数据库中的属性来存储图像URL。

答案 4 :(得分:0)

Ciao,这个函数也删除了所有的点,然后我用扩展名创建了干净的字符串。

function sanitaze_upload_file($data)
{
    $imgName   = $data;
    $indexOFF  = strrpos($imgName, '.');
    $nameFile  = substr($imgName, 0,$indexOFF);
    $extension = substr($imgName, $indexOFF);
    $clean     = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile);
    $NAMEFILE  = str_replace(' ', '', $clean).$extension;
    return $NAMEFILE;
}

答案 5 :(得分:-2)

如果您不反对丢失实际的文件名,我通常会创建文件名的哈希并将文件名设置为,如果您正在开发的内容有大量上传的图片,它有助于避免两个冲突文件名命名相同,并且会发生覆盖。

hash('md5', $_FILES["filename"]["tmp_name"]);