上传具有唯一名称的图片

Upload image with unique name

所以我尝试使用下面的脚本将一些图像上传到我服务器上的文件夹,但它会将每张图像保存为 "image.jpg",如果我尝试上传多张图像,它会覆盖最后上传的图像 ones.As 你可以看到我评论了检查文件是否已经存在的部分让我上传文件并覆盖最新的 one.Help!我需要修改一些东西来随机化名称或获取原始图像名称。

<?php
$target_dir = "wp/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);

// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
/*if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}*/
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "png" && $imageFileType != "jpg") {
    echo "Sorry, only PNG and JPG files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

获取唯一文件名的一种简单方法是获取当前 Unix 时间(以毫秒为单位)并将其附加(或前置)到文件名。要使用的命令是 microtime().

例如:

$target_file = $target_dir . microtime() . basename($_FILES["fileToUpload"]["name"]);

您也可以尝试对文件进行散列处理以获得冲突概率较低的唯一散列值,但这种方法速度更快,同样有效。

您可以实现类似 Windows 的自动文件重命名:

$try = 1;
while($file_exists($target_file)) {
    $target_file = preg_replace('/(\(\d+\))*(\.[^\(\)]+)$/',
        "({$try})\2", $target_file);
    $try++;
}

这会将文件 "duplicate.jpg" 替换为 "duplicate(1).jpg",然后是 "duplicate(2).jpg",依此类推。

它仍然容易出现不太可能的竞争条件,就像使用 uniqid()microtime() 一样(在冲突方面,两者都更好)。

否则,始终使用tempnam()。您可以查看 this answer.