2010-04-01 1 views
14

J'utilise PHP pour télécharger une image depuis un formulaire vers le serveur et je veux renommer l'image lastname_firstname. [Original extension]. J'ai actuellement:Renommez un fichier téléchargé avec PHP mais gardez l'extension

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

qui, bien sûr, renomme le fichier lastname_firstname sans une extension. Comment renommer le fichier mais conserver l'extension?

Merci!

Répondre

28

Vous devez d'abord savoir ce que l'extension d'origine était ;-)

Pour ce faire, la fonction pathinfo peut faire des merveilles ;-)


citant l'exemple qui est donné dans la manuel:

$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 

vous donnera:

/www/htdocs 
index.html 
html 
index 


En tant que sidenote, ne pas oublier la sécurité:

  • Dans votre cas, vous devez échapper $_POST[lastname], pour vous assurer qu'il ne contient que valides caractères
  • Vous devriez également vérifier que le fichier est une image
+0

J'utilise aussi le is_uploaded_file() fonction pour vérifier si le fichier nous montrant est en fait un fichier téléchargé. –

+0

@Niels Bom: 'move_uploaded_file' le fait pour vous. – zneak

+0

@zneak Je me suis corrigé. –

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

C'est une ligne de code * longue *, la plupart des normes de codage déconseillent cela à cause d'une mauvaise lisibilité. Je vous suggère de les suivre. –

2

Tout d'abord, trouver l'extension:

$pos = strrpos($filename, '.'); 
if ($pos === false) 
{ 
    // file has no extension; do something special? 
    $ext = ""; 
} 
else 
{ 
    // includes the period in the extension; do $pos + 1 if you don't want it 
    $ext = substr($filename, $pos); 
} 

ensuite appeler votre fichier de toute façon que vous voulez, et ajouter au nom de l'extension:

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

EDIT y penser, rien de tout cela est optimal. Les extensions de fichier le plus souvent décrivent le type de fichier, mais ce n'est pas toujours le cas. Par exemple, vous pouvez renommer un fichier .png en une extension .jpg, et la plupart des applications détecteront toujours qu'il s'agit d'un fichier png. Autre que cela, certains systèmes d'exploitation n'utilisent tout simplement pas les extensions de fichiers pour déterminer le type d'un fichier. Avec les téléchargements $_FILE, un élément type représente le type MIME du fichier que vous avez reçu.Si vous le pouvez, je vous suggère de compter sur elle plutôt que sur l'extension donnée:

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

Vous pouvez avoir un more complete list of MIME types here.

+0

j'ai raté le double r! vous avez raison monsieur! – mote

0

vous pouvez toujours:

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

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

Vous pouvez essayer:

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

ou Niels Bom suggéré

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

C'est une ligne de code * longue *, la plupart des normes de codage déconseillent cela à cause d'une mauvaise lisibilité. Je vous suggère de les suivre. –

+0

cela devrait être plus lisible .. :-) – kviksilver

4

Ne pas oublier si vous autorisez les gens à télécharger des fichiers arbitraires, sans vérifier l'extension, ils peuvent parfaitement télécharger un fichier .php et exécuter du code sur votre serveur;)

Les règles de .htaccess pour refuser l'exécution de PHP dans un certain dossier est quelque chose comme ça (sur mesure pour votre configuration) ..

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

Mettre cela dans un fichier .htaccess dans le dossier dans lequel vous téléchargez des fichiers .

Sinon, gardez à l'esprit que les fichiers peuvent avoir plus d'un "." en eux, et tu devrais être doré.

3

ce code est peu sûr

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

si

$_POST[firstname] =mypicture.php%00 

et

$extension=.jpg; 

ce code est vulnérable et le résultat est

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

pour plus d'informations, consultez ce lien:

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