在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);