Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中按数字重命名图像_Php - Fatal编程技术网

在php中按数字重命名图像

在php中按数字重命名图像,php,Php,我正在尝试创建一个选项,上传一个头像到我的网站。我试图实现的是: 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('

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

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()
没有任何作用,因此请使用它演示如何实现我的目标。

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

<? xml version="1.0" ?>
<MyRootNode>
  <count>123</count>
</MyRootNode>
如果您的服务器支持文件锁定(这是一个很大的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?
    }
}

若将用户存储在数据库中,并且存在整数用户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");
函数getNextFileName() { $a=0; $b=2147483647; 而($a<$b) { $c=楼层($a+$b)/2); 如果(文件_存在($c.jpg))$a=$c+1; else$b=$c; } 返回“$a.jpg”; } 函数saveAvatar($avatar) { 对于($i=0;$i<16;$i++) { $name=getNextFileName(); $fd=fopen($name,'x'); 如果($fd!==FALSE) { fwrite($fd,$avatar); 现金流量表(美元); 返回$name; } } 返回FALSE; } 对于($i=0;$i<20;$i++) saveAvatar(“BlahBlahBlah$i”);
似乎您在生成随机数方面有问题,您可以尝试以下方法:

  $prefix = substr(str_shuffle("0123456789"), 0,3);
  $file1 = $prefix.'.'.end(explode('.',$_FILES['cover']['name']));  
上面的$prefix类似于:任意3位随机数字

希望会有帮助

    /*
     * 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);

如果上载文件夹中存在相同的文件名。它将自动生成

阿凡达1.jpg, 阿凡达2.jpg,
阿凡达_3.jpg,ans等等。

如果我允许一个任务同时注册和上传一个阿凡达怎么办?@shnisaka注意,我在
'x'
模式下使用
fopen
,这意味着它永远不会覆盖现有文件,我最多会尝试16次保存阿凡达。因此,如果在
getNextFileName
fopen
之间,sombody else将使用我生成的名称创建文件,我将重试。三位数随机数可能不够唯一,因此您可能应该在重试循环中执行此操作,检查是否已存在具有生成的随机名称的文件。
    /*
     * 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);