RE: asking comment

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> 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

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux