2010-04-01 23 views
14

Sto utilizzando PHP per caricare un'immagine da un modulo sul server e voglio rinominare l'immagine lastname_firstname. [Estensione originale]. Al momento ho:Rinominare un file caricato con PHP ma mantenere l'estensione

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]") 

che, ovviamente, rinomina il file lastname_firstname senza un'estensione. Come rinominare il file ma mantenere l'estensione?

Grazie!

risposta

28

È necessario trovare prima cosa l'estensione originale era ;-)

Per fare questo, la funzione pathinfo può fare miracoli ;-)


Citando l'esempio che ha dato nel manuale:

$path_parts = pathinfo('/www/htdocs/index.html'); 
echo $path_parts['dirname'], "\n"; 
echo $path_parts['basename'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; // since PHP 5.2.0 

vi darà:

/www/htdocs 
index.html 
html 
index 


Come sidenote, non dimenticare la sicurezza:

  • Nel tuo caso, si dovrebbe scappare $_POST[lastname], per assicurarsi che contenga solo validi caratteri
  • Si dovrebbe anche controllare che il file è un'immagine
+0

Io uso anche la is_uploaded_file() funzione per controllare se il file che stiamo indicando è in realtà un file caricato. –

+0

@Niels Bom: 'move_uploaded_file' lo fa per te. – zneak

+0

@zneak Sono corretto. –

0
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION)); 
+1

Questa è una * lunga * linea di codice, la maggior parte degli standard di codifica sconsiglia di farlo a causa della scarsa leggibilità. Ti suggerisco di seguirli. –

2

In primo luogo, trovare l'estensione:

Quindi chiamare il file che si desidera in ogni caso, e aggiungere al nome l'estensione:

$newFilename = "foobar" . $ext; 
move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename); 

EDIT Pensare di esso, niente di tutto questo è ottimale. Le estensioni dei file il più delle volte descrivono il tipo di file, ma questo non è sempre il caso. Ad esempio, è possibile rinominare un file .png in un'estensione .jpg e la maggior parte delle applicazioni potrebbe comunque rilevare che si tratta di un file png. Oltre a questo, alcuni sistemi operativi semplicemente non usano le estensioni dei file per determinare il tipo di un file.

Con i caricamenti $_FILE, viene fornito anche un elemento type che rappresenta il tipo MIME del file ricevuto.Se è possibile, vi consiglio di fare affidamento su di esso invece che sul prolungamento data:

$imagetypes = array(
    'image/png' => '.png', 
    'image/gif' => '.gif', 
    'image/jpeg' => '.jpg', 
    'image/bmp' => '.bmp'); 
$ext = $imagetypes[$_FILES['myfile']['type']]; 

si può avere un more complete list of MIME types here.

+0

ho perso la doppia r! hai ragione, signore! – mote

0

si potrebbe sempre:

$original = explode('.', $_FILES["picture"]["tmp_name"]); 
$extension = array_pop($original); 

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 
4

si può provare:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"]))) 

o come Niels Bom suggerito

$filename=$_FILES["picture"]["tmp_name"]; 
$extension=end(explode(".", $filename)); 
$newfilename="$_POST[lastname]" . '_' . "$_POST[firstname]".".".$extension; 
move_uploaded_file($filename, "peopleimages/" .$newfilename); 
+0

Questa è una * lunga * linea di codice, la maggior parte degli standard di codifica sconsiglia di farlo a causa della scarsa leggibilità. Ti suggerisco di seguirli. –

+0

questo dovrebbe essere più leggibile .. :-) – kviksilver

4

Non dimenticate, se si consente alle persone di caricare file arbitrari, senza controllare l'estensione, possono perfettamente caricare un file .php ed eseguire il codice sul tuo server;)

Le regole .htaccess di negare l'esecuzione php all'interno di una determinata cartella è qualcosa di simile (su misura per la configurazione) ..

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi 
Options -ExecCGI 

mettere questo in un file .htaccess nella cartella in cui si sta caricando i file .

Altrimenti, è sufficiente tenere presente che i file possono avere più di uno "." in loro, e dovresti essere d'oro.

3

questo codice è insicuro

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 

se

$_POST[firstname] =mypicture.php%00 

e

$extension=.jpg; 

questo codice è vulnerabile ed è risultato

test.php%00.jpg //test.php uploaded on server. 

Per maggiori informazioni visitate questo link:

https://www.owasp.org/index.php/Unrestricted_File_Upload