In many situations, we need to make the filename different on the server when creating them to prevent duplication. And the most common answer to that seems to be, append th
All these answers seem overkill:
$k = 0;
while(!$result){
if(!file_exists("file[$k].ext"))
$result = "file[$k].ext";
$k++;
}
makefile($result);
function incrementFileName($file_path,$filename){
$array = explode(".", $filename);
$file_ext = end($array);
$root_name = str_replace(('.'.$file_ext),"",$filename);
$file = $file_path.$filename;
$i = 1;
while(file_exists($file)){
$file = $file_path.$root_name.$i.'.'.$file_ext;
$i++;
}
return $file;
}
Here's a simple function I wrote for this purpose:
function incrementFileName($file_path,$filename){
if(count(glob($file_path.$filename))>0)
{
$file_ext = end(explode(".", $filename));
$file_name = str_replace(('.'.$file_ext),"",$filename);
$newfilename = $file_name.'_'.count(glob($file_path."$file_name*.$file_ext")).'.'.$file_ext;
return $newfilename;
}
else
{
return $filename;
}
}
USAGE:
$newName = incrementFileName( "uploads/", $_FILES["my_file"]["name"] );
move_uploaded_file($_FILES["my_file"]["tmp_name"],"uploads/".$newName);
Here is a short code snippet that demonstrates how you might start solving this problem.
// handle filename collision:
if(file_exists($newFile)) {
// store extension and file name
$extension = pathinfo($newFile,PATHINFO_EXTENSION);
$filename = pathinfo($newFile, PATHINFO_FILENAME);
// Start at dup 1, and keep iterating until we find open dup number
$duplicateCounter = 1;
// build a possible file name and see if it is available
while(file_exists($iterativeFileName =
$newPath ."/". $filename ."_". $duplicateCounter .".". $extension)) {
$duplicateCounter++;
}
$newFile = $iterativeFileName;
}
// If we get here, either we've avoided the if statement altogether, and no new name is necessary..
// Or we have landed on a new file name that is available for our use.
// In either case, it is now safe to create a file with the name $newFile