为上传的图像赋予 mysqli 的唯一名称

Giving uploaded images a unique name for mysqli

我希望允许用户上传图片而不会出现冲突问题,这些问题可能由多个用户上传可能具有相同图片名称的图片引起。我对如何执行这个感到困惑,我不知道从哪里开始..

这是我的代码:

 if(isset($_POST['submitimage'])){
                move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$_FILES['file']['name']);
                $con = mysqli_connect("localhost","root","","database");
                $q = mysqli_query($con,"UPDATE users SET image = '".$_FILES['file']['name']."' WHERE user_id = '".$_SESSION['user']."'");
                 header("Location: index.php");
        }
?>

任何帮助都会很棒。谢谢!

您可以这样做的一种方法是生成一些随机数(并可能以数字格式将它们附加到当前日期)并为图像提供数字序列。

 if(isset($_POST['submitimage'])){
            //generate 3 sequences of random numbers,you could do more or less if you wish
            $randomNumber=rand().rand().rand();
            move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$randomNumber."jpg");
            $con = mysqli_connect("localhost","root","","database");
            $q = mysqli_query($con,"UPDATE users SET image = '".$randomNumber.".jpg' WHERE user_id = '".$_SESSION['user']."'");
             header("Location: index.php");
    }
?>

注意:如果您不喜欢数字,您也可以查看 generating random strings

我的解决方案是为每个上传的文件生成一个随机字符串,即:

<?php
   if(!empty($_POST['submitimage'])){
                //get file extension.
                $ext = pathinfo($_FILES['file']['name'])['extension'];
                //generate the new random string for filename and append extension.
                $nFn = generateRandomString().".$ext";
                move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$nFn);
                $con = mysqli_connect("localhost","root","","database");
                $q = mysqli_query($con,"UPDATE users SET image = '{$nFn}' WHERE user_id = '{$_SESSION['user']}'");
                 header("Location: index.php");
        }

function generateRandomString($length = 10) {
    return substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);
}

?>

PHP 具有在您的服务器上生成唯一文件的内置功能。此函数称为 tempnam()。但是,如果您仔细阅读该网站上的评论,那么如果许多进程同时调用该函数,您将有可能从该函数中获得不需要的行为。所以对该函数的修改如下:

<?php

function tempnam_sfx($path, $suffix){
    do {
        $file = $path."/".mt_rand().$suffix;
        $fp = @fopen($file, 'x');
    }
    while(!$fp);

    fclose($fp);
    return $file;
}

?>

因为文件在创建时保持打开状态,其他进程无法访问它,因此不可能仅仅因为您的几个网站访问者碰巧上传了图片就创建了 2 个同名文件在同一时刻。因此,要在您自己的代码中实现它:

<?php

function tempnam_sfx($path, $suffix){
    do {
        $file = $path."/".mt_rand().$suffix;
        $fp = @fopen($file, 'x');
    }
    while(!$fp);

    fclose($fp);
    return $file;
}

$uploaddir = 'pictures'; // Upload directory
$file = $_FILES['file']['name']; // Original file
$ext = pathinfo($path, PATHINFO_EXTENSION); // Get file extension

$uploadfile = tempnam_sfx($uploaddir, $ext);

move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile);
$con = mysqli_connect("localhost","root","","database");
$q = mysqli_query($con,"UPDATE users SET image = '".basename($uploadfile)."' WHERE user_id = '{$_SESSION['user']}'");
header("Location: index.php");

?>