Newsgroup: it.comp.www.php
Titolo: Upload file concorrenziali

Ho dato un occhiata a numerosi script onde evitare di re-inventare la 
ruota ma quelli che ho trovato sono poco più che banali esempi di file 
upload che si limitano a fare un move dalla dir /tmp alla directory di 
destinazione utilizzando lo stesso nome file il ché provoca ovviamente 
un gran casino se 2 o più utenti cercano di caricare file diversi con lo 
stesso nome sia simultaneamente dato che utilizzano lo stesso path sia 
che lo facciano a distanza di tempo.
Possibile che non esista già bello e pronto uno script che rinomini i 
file in N.dat inserendo il link e relativo nome originale in un DB?
Link idee?


utilizzando Zendframework
public function  allegatoAction()
{
	$form= new Forms_UploadPrev();
	//controllo se c'è il post
	if ($this->_request->isPost())
	{
		//prendo i dati dal form
		$formData = $this->_request->getPost();
		//controllo la loro validità
		if ($form->isValid($formData))
		{
		//la parte che ti interessa quella dell'upload
	 //istanzio un adapter http (ZF utilizza il protocollo HTTP)
		$file_allegato = new Zend_File_Transfer_Adapter_Http();
		//prendo le info del file
		$nomefile =$file_allegato->getFileInfo('InputAllegato');
	//imposto la destinazione finale del file uplodato
	$file_allegato->setDestination($this->_config_params['cliente']['uploadpath']);
		//creo un nome univoco in fase di upload utilizzando la funzione uniqid()
		$newfile = strtoupper("ATTACH-".uniqid());
 
		//aggiungo dei filtri rinominando il vero file con il nome univoco 
(compreso il path) + il nome vero del file
		// quindi avro il file pippo.xls che verrà salvato sul server come 
ATTACH-4C99E37865C6A-pippo.xls
		$file_allegato->addFilter('Rename', 
$this->_config_params['cliente']['uploadpath'].$newfile.'-'.$nomefile['InputAllegato']['name']);
 
		//ricevo il file
		$file_allegato->receive();
		//imposto alcuni dati che mi servono per scivere il db (la tabella 
degli allegati)
	$data = array (
	   'id_allegato'	=> substr($newfile, 7),
	   'tipo_allegato'   =>  'C',
	   'id_fattarb'	=> $form->getValue('prevent'),
// qui c'è IL VERO NOME DEL FILE (originale)
    	   'nome_file'	=> $form->getValue('InputAllegato'),
	   //il nome del file SALVATO sul SERVER
   	   'file_allegato' =>  $newfile.'-'.$nomefile['InputAllegato']['name'],
	'titolo'  => $form->getValue('titolo'),
	'descrizione'  => $form->getValue('DescrizioneAllegato'),
				    'data_allegato' => date('Y-m-d')
				);
//inserisco i dati nel db
	$insertallegato = new Model_Allegato();
	$insertallegato->save('new',$data);
//imposto la risposta con Json
	$datajson = array (
	            'status'         => 'success',
	            'id_allegato'    => substr($newfile, 7),
   	            'nome_file' => $form->getValue('InputAllegato'),
	            'titolo'         => $form->getValue('titolo'),
		    'descrizione' => $form->getValue('DescrizioneAllegato') ); 								
				$dojoData= new Zend_Dojo_Data('id_allegato',array($datajson));
			}
			else
			{
				echo "<textarea>{'status':'error', 'descerr:': Upload errato, 
riprovare'}</textarea>";
				exit();
			}
		}
		else
		{
			echo "<textarea>{'status':'error', 'descerr:': Upload errato, 
riprovare'}</textarea>";
			exit();
		}
 
		echo '<textarea>'.$dojoData->toJson().'</textarea>';
		exit();
	}
quando devo presentare il file in una pagina, prendo dal db il nome vero 
(che stampo a video) , ma in fase di download vado a prendere il 
corrispondente nome univoco salvato sul server
Spero di esserti utile, se hai dubbi non esitare
Ciao

[hai già nome file originale]
$hash = hash('crc32b', mt_rand(0, 50000));
$safe_file_name = to_file_name($original_filename); // Assicuriamoci che il nome del file sia valido e non contenga, ad esempio, '../'
$file_name = $hash . ' - ' . $original_filename;
while(file_exists($path_upload . $file_name))
{
    $hash = hash('crc32b', mt_rand(0, 50000));
    $file_name = $hash . ' - ' . $safe_file_name;
}