Caricamento image PHP: rinomina senza perdere l'estensione?

Al momento ho:

$file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); $new_file_name=$random_digit.$file_name; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful<BR/>"; echo "File Name :".$new_file_name."<BR/>"; echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; } else { echo "Error"; } } 

questo genera un numero random prima del nome del file corrente, ad esempio 4593example.jpg, ma vorrei solo che riscriva l'integer nome del file in 4593.jpg rimuovendo il nome ucrrent (esempio). Quando ho provato a farlo perdo l'estensione (.jpg) each aiuto è apprezzato.

 $ext = pathinfo($filename, PATHINFO_EXTENSION); $newFilename = $random_digit . '.' . $ext; 

A proposito, cosa succederà se il numero random si scontra (cosa che potrebbe accadere dopo o tra 10 anni)?

Esistono molti modi migliori per nominarli, ad esempio hash del nome del file e time() dovrebbero teoricamente mai interferire (anche se in pratica si verificano collisioni di hash).

Se hai a che fare solo con le immagini, prenderei in considerazione il rilevamento del tipo di image usando getimagesize() e dando al nuovo file un'estensione in base a ciò.

In questo modo, non devi fare affidamento su quale estensione ottieni dall'utente (che potrebbe essere errata).

Così:

 $extensions = arrays( IMAGETYPE_JPG => "jpg", IMAGETYPE_GIF => "gif", IMAGETYPE_PNG => "png", IMAGETYPE_JPEG2000 => "jpg", /* ...... several more at http://php.net/manual/en/image.constants.php I'm too lazy to type them up */ ); $info = getimagesize($_FILES['uid']['tmp_name']); $type = $info[2]; $extension = $extensions[$type]; if (!$extension) die ("Unknown file type"); move_uploaded_file($_FILES['uid']['tmp_name'], $path.".".$extension); 

`Inoltre:

  • Come dice @alex, il tuo metodo ha un rischio considerevole di collisioni di nomi casuali. Dovresti aggiungere un controllo file_exists() per prevenirli (ad es. Un ciclo che crea un nuovo numero random finché non viene trovato uno che non esiste ancora)

  • HTTP_POST_FILES è deprecato, usa $_FILES invece

  • Vi consiglio caldamente di usare move_uploaded_file() invece di copy() che è vulnerabile agli attacchi.

È ansible get l'estensione originale utilizzando il seguente codice:

$extension = strrchr($HTTP_POST_FILES['uid']['tmp_name'], '.');

Quindi puoi aggiungere l'estensione alla variabile $new_file_name questo modo:

$new_file_name = $random_digit . $file_name . '.' . $extension;

Puoi usare questo codice:

 $file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); $extension= end(explode(".", $HTTP_POST_FILES['uid']['name'])); $new_file_name=$random_digit.'.'.$extension; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful "; echo "File Name :".$new_file_name." "; echo "File Size :".$HTTP_POST_FILES['uid']['size']." "; echo "File Type :".$HTTP_POST_FILES['uid']['type']." "; } else { echo "Error"; } } 

godere!!!!!!!!!