|
Posted by Jared Williams on 03/30/05 18:16
>
> I got a bit frustrated with image upload stuff with different
> image name problems. So I created a system that gives the
> uploaded imaged a random numeric name between 1-10 000 000
> and saves the file to a server folder and the image name to mysql DB.
>
> Is there a so sort of a problem here that I am not thinking
> of? I only can imagine problem that the rand() gives the same
> value twice. But I cant see this as a major problem because
> there would be maybe not more than 1000 uploaded pictures. So
> the chance is at worst something like 1:10 000 that same name
> is created to the image.
>
> Anyway if same name is created what's the best way to check
> that? I was thinking of putting the image name field in DB as
> a unique field. That would do it? Right?
Append a datetime to the filenames, or use a folder per date?
If want to create a unique filename, and are using PHP4.3.2 or better, use fopen() with the 'x' or 'x+' mode, rather than
file_exists().
Something like the function below,
The filename parameter is passed by reference, so you can retrieve the filename the function actually created.
Returns a FALSE, or a standard file handle which can fwrite() etc.
function createFileWithUniqueName(&$filename)
{
$f = @fopen($filename, 'x');
if ($f === FALSE)
{
$pathInfo = pathinfo($filename);
$dirname = $pathInfo['dirname'];
$basename = $pathInfo['basename'];
$extension = $pathInfo['extension'];
if (!empty($dirname))
$dirname .= DIRECTORY_SEPARATOR;
if (!empty($extension))
{
$extension = '.'.$extension;
$basename = substr($basename, 0, -strlen($extension)); // Remove extension from basename
}
$prefix = $dirname.$basename.'_';
/* Keep trying to create new files ... The $n < 100 is just to prevent any extreme situations happening */
for ($n = 1; $f === FALSE && $n < 100; ++$n)
{
$name = $prefix.$n.$extension;
$f = @fopen($name, 'x');
}
if ($f !== FALSE)
$filename = $name;
}
return $f;
}
$basename = 'test.txt';
$n = $basename;
$f = createFileWithUniqueName($n);
if ($f !== FALSE)
{
fwrite($f, 'test '.$n);
fclose($f);
}
$n = $basename;
$f = createFileWithUniqueName($n);
if ($f !== FALSE)
{
fwrite($f, 'test '.$n);
fclose($f);
}
Jared
Navigation:
[Reply to this message]
|