1

我正在尝试创建一个将头像上传到我的网站的选项。我想要实现的是:

first avatar : 1.jpg
second avatar : 2.jpg
third avatar : 3.png 
and so on.. 

如何在 php 中创建上传计数器?我当前的代码是这样的:

if(!empty($_FILES['cover']['tmp_name']))
{
    $uploadfolder =  "avatar/"; 
    $file1 = rands().'.'.end(explode('.',$_FILES['cover']['name'])); 
    $cover = $uploadfolder.$file1;
    move_uploaded_file($_FILES['cover']['tmp_name'],$cover);
}
else 
{
    $cover = ''
}

该函数rands()不做任何事情,所以请用它来演示我如何实现我的目标。

4

5 回答 5

1

如果您将用户存储在数据库中并且有整数用户 ID,则最好使用此用户 ID 进行文件命名,而不是单独的递增计数器。

您还可以查看现有文件以找到最大的现有数量,如下所示:

function getNextFileName ()
{
    $a = 0;
    $b = 2147483647;

    while ($a < $b)
    {
        $c = floor (($a + $b) / 2);
        if (file_exists ("$c.jpg")) $a = $c + 1;
        else $b = $c;
    }

    return "$a.jpg";
}

function saveAvatar ($avatar)
{
    for ($i = 0; $i < 16; $i++)
    {
        $name = getNextFileName ();
        $fd = fopen ($name, 'x');
        if ($fd !== FALSE)
        {
            fwrite ($fd, $avatar);
            fclose ($fd);
            return $name;
        }
    }
    return FALSE;
}

for ($i = 0; $i < 20; $i++)
    saveAvatar ("BlahBlahBlah$i");
于 2013-03-09T06:42:48.323 回答
1

看来你在生成随机数方面有问题,你可以试试这个:

  $prefix = substr(str_shuffle("0123456789"), 0,3);
  $file1 = $prefix.'.'.end(explode('.',$_FILES['cover']['name']));  

上面的 $prefix 就像:任何随机的 3 位数字

希望会有所帮助!

于 2013-03-09T06:43:34.983 回答
1
    /*
     * currentDir - path - eg. c:/xampp/htdocs/movies/uploads (no end slash)
     * $dir - points current working directory.
     * $filename - name of the file.
 */

public static function getFileName($dir, $filename) {

    $filePath = $dir . "/uploads/" . $filename;
    $fileInfo = pathinfo($filePath);
    $i = 1;
    while(file_exists($filePath)) {
        $filePath = $dir . "/uploads/" . $fileInfo['filename'] . "_" . $i . "." . $fileInfo['extension'];
        $i++;

    }
    return $filePath;
}

move_uploaded_file($_FILES['cover']['tmp_name'],$filePath);

如果您的上传文件夹中存在相同的文件名。它会自动生成

avatar_1.jpg,avatar_2.jpg,avatar_3.jpg,等等..

于 2013-03-09T06:46:49.833 回答
0

创建一个 XML 文件并将计数存储在其中

<? xml version="1.0" ?>
<MyRootNode>
  <count>123</count>
</MyRootNode>

更新

在您向问题添加更多代码后添加更新。

Function Rands(FileExtension as string) as long
  '1 open xml file 
  '2 read counter in
  '3 increment counter
  '4 save value to back xml file
  '5 return incremented counter with the file extension passed attached on the end
  'This is in case a BMP GIF or PNG has been and not JPG
  ' SAMPLE filename 123.GIF
End Function
于 2013-03-09T06:17:43.907 回答
0

如果(这是一个很大的 IF)你的服务器支持文件锁定,你可以合理地确保你有一个唯一的递增 ID:

function get_avatar_id()
{
    $lockfile = fopen("avatar_id_lock_file","a");
    if(flock($lockfile, LOCK_EX)) // Get an exclusive lock to avoid race conditions
    {
        $avatar_id = intval(file_get_contents("avatar_id"); // Assumes you made it and put a number in it
        $avatar_id++;
        file_put_contents("avatar_id", $avatar_id);
        flock($lockfile, LOCK_UN);
        fclose($lockfile);
        return $avatar_id;
    }
    else
    {
        //What do you want to do if you can't lock the file?
    }
}
于 2013-03-09T06:21:31.383 回答