Jump to content

PHP Rename File


JustinMs66@hotmail.com

Recommended Posts

ok so i have a working awesome uploads script, but it needs something. this is what i want it to have:

it checks the "/uploads/" directory for the name of the file it's uploading. IF it dosn't exist, then continue. if it DOES exist, then rename it to the file name + "_1" and then check if THAT exists, and if it DOES, then take away the "_1" and put in "_2" and keep going until it dosn't exist, and then upload with that file name.

here is my current code

[code]<?php
//check for types that i DON"T want to have uploaded:
$bad_types = array('application/x-php');

//if it is a bad file, then say "F*** you
if( in_array( $_FILES['uploadedfile']['type'], $bad_types ) )
{
    echo "That File type is not supported.";
}
else
{
//otherwise continue uploading
$target_path = "uploads/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

//uploads the file
    if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {

//display the link to the file:
echo "The file ".  basename( $_FILES['uploadedfile']['name']).
        " has been uploaded. here is the link to your file: <a href='uploads/".  basename( $_FILES['uploadedfile']['name']). "'>".  basename( $_FILES['uploadedfile']['name']). "</a>";
    } else{
        echo "There was an error uploading the file, please try again!";
    }[/code]

can anyone get me started?
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/
Share on other sites

Untested, but my logic seems sound to me :)

[code]<?php

function CheckFile($strDirectory, $strFile) // $strDirectory MUST include a trailing slash!
{
if($strFile && file_exists($strFile))
{
$x = 0;
do {
$x++;
} while(file_exists($strDirectory . $x . "_" . $strFile));
$strNewName = $x . "_" . $strFile;

}else{
return $strFile; // unique filename
}

return $strNewName;
}

?>[/code]

Now what it does is; You tell the function which filename your looking for (and in what directory) and it returns the closest filename to what you specified (which is unique)...

eg:
[code]$strUniqueFilename = CheckFile("uploads/", $_FILES['uploadedfile']['name']);[/code]

Hope that helps :)
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/#findComment-121795
Share on other sites

If you use PHP5, you could do like this:

[code=php:0]<?php

function scanfiles($dir, $filename, $nr = 1) {

$tmp_name = basename($filename, '.php') . "_$nr.php";

$file = scandir($dir);

// If the file doesn´t exist, return the new filename.
if (!in_array($tmp_name, $file)) {

return $tmp_name;

// If the file exist, search again...
} else {

$nr++;
return scanfiles($dir, $filename, $nr);

}

}



// Some code here...




$dir = "uploads"; // no trailing slash!


// And the new filename is... ?
$new_filename = scanfiles($dir, $_FILES['uploadedfile']['name']);
$target_path = "$dir/$new_filename";


if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {

// Do your stuff here...

}

?>[/code]
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/#findComment-121859
Share on other sites

[quote author=heckenschutze link=topic=114322.msg465197#msg465197 date=1163032155]
If you had say 2 billion files in the directory, its going to get very slow using Nicklas's method.
[/quote]
well:
1) i'm using PHP4
2) i only have a couple thousand files, so that shouldn't be a problem anywho.

anyway, thank you for your code and i will try it out!
thanks!
:)
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/#findComment-121881
Share on other sites

[quote author=heckenschutze link=topic=114322.msg465197#msg465197 date=1163032155]
If you had say 2 billion files in the directory, its going to get very slow using Nicklas's method.[/quote]

2 billion files in one directory... not possible!
This method slow? Well, I tried the script in a few folders with 5-7000 files in each and it spits back a new filname in around 0.04xxx seconds on my old laptop.

To make it compatible with PHP4, just change
[code]$file = scandir($dir);[/code]

to this:
[code]if ($handle = opendir($dir)) {
 
  while (false !== ($cont = readdir($handle)))
  if (!is_dir($dir)) $file[] = $cont;

}

closedir($handle);[/code]
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/#findComment-121904
Share on other sites

[quote author=Nicklas link=topic=114322.msg465230#msg465230 date=1163037856]
[quote author=heckenschutze link=topic=114322.msg465197#msg465197 date=1163032155]
If you had say 2 billion files in the directory, its going to get very slow using Nicklas's method.[/quote]

2 billion files in one directory... not possible!
This method slow? Well, I tried the script in a few folders with 5-7000 files in each and it spits back a new filname in around 0.04xxx seconds on my old laptop.

To make it compatible with PHP4, just change
[code]$file = scandir($dir);[/code]

to this:
[code]if ($handle = opendir($dir)) {
 
  while (false !== ($cont = readdir($handle)))
  if (!is_dir($dir)) $file[] = $cont;

}

closedir($handle);[/code]
[/quote]

Yes its possible, You don't need to scan through ALL of the files just to see if one file exists, your loading the [b]entire[/b] directory contents into [b]memory[/b]... very un-resource friendly.

Eg if you had 7000 files, with an average of 60 bytes per filename, thats [b]420kb[/b] of memory already gone. It may not seem a lot, but multiply that by several thousand users using your site at one time...

Thats why you must be aware that you can't just go haywire with arrays with 7000 + elements.
Link to comment
https://forums.phpfreaks.com/topic/26625-php-rename-file/#findComment-121913
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.