保存PHP之前图像的唯一名称


Unique name for image before saving PHP

如何为图片设置唯一的名称?我试图使用tempnam(),但它总是将URL和文件保存为.tpm。下面是我的代码:

$file = $_FILES['file'];
$name = $file['name'];
$tname = tempnam("imagenes/", $name);
$path = "imagenes/" . basename($tname);
if (move_uploaded_file($file['tmp_name'], $path)) {
    // Move succeed.
} else {
    // Move failed. Possible duplicate?
}
$sql = mysql_query("INSERT INTO `productos` (`img`) VALUES ('".$path."')");
// ...

另外,我如何检查(安全),如果图像已经真正发布?比如mime类型之类的

更新:

我只是使用

修复了唯一的名称
$tname =  uniqid().$name;

要检查有效的图像和文件大小,

$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| 
($_FILES["file"]["type"] == "image/jpeg")
||
($_FILES["file"]["type"] == "image/jpg")
||
($_FILES["file"]["type"] == "image/png"))
&&
($_FILES["file"]["size"] < 10485760)&& in_array($extension, $allowedExts))                {
    //DO
}

对于唯一的图像,我建议您将图像存储在新表中,并附加图像id作为文件名!

不可能使用tempnam()指定扩展名。不幸的是,这就是事实。

虽然您描述的问题听起来像是一个容易解决的任务,但避免可能的竞争条件(不使用tempnam())是有问题的。尽管它们不太可能出现,但这种可能性仍然存在。

如果你确定只有PHP在那个目录下工作,你可以实现一个基于flock()的机制来确保一个文件只被创建一次。

如果你不太关心那种可能的,但不太可能的竞态条件,我建议你也使用这样的语句:

$filename = 'images/' . uniqid() . '.jpg';