我有一个PHP应用程序。
我允许用户将文件上传到我的网络应用程序。
问题:在PHP中清理上传文档$_FILES["filename"]["tmp_name"]
的文件名的最佳方法是什么?
更新:
我可以获取上传文件名的MD5并将其用作新分配的文件名吗?如果是这样,我如何在PHP中执行此操作?
答案 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"]);