上传具有唯一名称的图像


Upload image with unique name

所以我正在尝试使用以下脚本将一些图像上传到服务器上的文件夹中,但它将每个图像保存为"image.jpg",如果我尝试上传多个图像,它会覆盖上次上传的图像。如您所见,我评论了检查文件是否已存在的部分,以让我上传文件并覆盖最新版本。帮助!我需要修改一些东西来随机化名称或获取原始图像名称。

<?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() 。您可以查看此答案。