[PHP] Upload de fichier - Récupérer l'extension

Salut :hello:

J’ai un petit soucis avec un code, j’ai cherché sur plusieurs sites et je ne comprend pas ce qui ne fonctionne pas, peut-être que vous pourrez m’aider ^^

Le but, c’est un petit outil qui permet d’uploader des fichiers sur un site.
Pour ça j’ai pris un code tout simple que l’on trouve sur tous les sites.

J’y ai ajouté un petit truc, c’est que le nom du fichier est attribué automatiquement par ordre.
En fait, chaque nom est à chaque enregistrement je fais ajouter +1 dans le fichier de référence.

L’upload se passe bien mais où je peine c’est pour récupérer l’extension du fichier pour la lui réatribuer.
Ex : J’upload le fichier test.jpg, il sera renomé en tempXXX, puis en 26 (d’après le nombre courrant).
Le problème c’est que je veux ajouter l’extension “.jpg” après le 26 et là ça coince.

Voilà le code que j’utilise :

— Contenu de formulaire.htm —

<form method="POST" ENCTYPE="multipart/form-data" action="upload.php">
<p>
<input type="file" name="fichier" size="20"></p>
<p>
<input type="submit" value="Envoyer" name="B1"></p>
</form>

— Contenu de upload.php …


<?php

    $repertoireDestination = "";
	include("id.php");
    $name = $id + 1;
	$filename = $fichier;
	$extension=strrchr($filename,'.');
	
    
    if (is_uploaded_file($_FILES["fichier"]["tmp_name"])) {
        if (rename($_FILES["fichier"]["tmp_name"],
                   $repertoireDestination.$name.$extension)) {
            echo "Le fichier temporaire".$_FILES["fichier"]["tmp_name"].
                 " a été déplacé vers ".$repertoireDestination.$name.$extension;
     
	$identifi = '<?php'."\n\n";
	$identifi .= '$id = \'' . $name . '\';' . "\n";
	$identifi .= '?' . '>';
	$x = fopen("id.php","w"); 
	fputs($x, $identifi ); 
	fclose($x); 
     
        } else {
            echo "Le déplacement du fichier temporaire a échoué".
                 " vérifiez l'existence du répertoire ".$repertoireDestination;
       }          
    } else {
       echo "Le fichier n'a pas été uploadé";
    }
  
?>

Ca se passe sur un serveur dédié, j’ai donc modifié ces paramètres dans php.ini (php4 / php5) :

file_uploads= On
upload_tmp_dir = tmp
upload_max_filesize = 2000M
post_max_size = 2000M

Voilà, n’étant pas un pro du PHP, je dois avoir fais une erreur quelque part ?
Merci d’avance :wink:

A vue de nez, je ne vois pas trop où est l’erreur (sinon que j’aurais utilisé un move_uploaded_file à la place du rename, et que dans ton cas le fichier s’appellera xxx.jpg et non tempxxx.jpg). Peux tu faire un copier coller du message affiché par echo ?

Sinon, ta manipulation de fichier pour augmenter le numéro, c’est limite. Si tu es le seul à utiliser cette page alors ça devrait suffire, mais ça posera problème à partir du moment où plusieurs personnes utiliseront simultanément cette page :wink:

EDIT : Ah, et le $filename = $fichier est aussi à proscrire. Utilise plutôt $_FILES[‘fichier’][‘name’] pour récuperer le nom du fichier :slight_smile:

Comme il n’y a pas le langage dans le titre, comme le demande la charte lue par tout un chacun ici (n’est ce pas), voici comment tu peux faire en C :


/**
 * Retourne une chaîne de caractère (en fait, un pointeur sur le dernier "." trouvé dans s) contenant l'extension.
 *
 * @param s le nom de fichier
 * @return l'extension dans le nom de fichier. Ce pointeur ne doit jamais être libéré : il le sera automatiquement quand s le sera. Renvoie NULL si aucune extension
 */

const char* getextension(const char* s) {
  char* dot = NULL;
  while (*s != '\0') {
    ++s;
    if (*s == '.') dot = s; // on veut juste l'extension, pas le point
  }
  return dot;
}

:MDR

Moi j’ai grave envie de me faire un jeudi soir sauce étudiante

J’ai quand même oublié un truc, parce que sans incrémenter ça fait une jolie boucle infinie :slight_smile:

:MDR Franchement le modo qui répond à une violation de charte par du code C je trouve ça excellent :lol:

T’es sûrement l’un des seul modo au monde à faire ça Sans-Nom :lol:

Bah :slight_smile: je bannis pas pour si peu, pas encore :slight_smile:

Désolé, j’avais complètement oublié de spécifier le language :jap:

J’ai finalement changé d’idée, j’utilise la date, l’heure courrante, la taille du fichier en octet et le nom d’origine pour former le nom complet du fichier.

Merci quand même :wink:

PS : merci aussi pour le cours de C :ane:

Ou alors :


ext = strrchr("foo.bar", '.');
if (NULL != ext)  // pourquoi pas l'inverse ? paske ! ^_^
   ++ext;

Ouais, mais c’est plus fun de le faire soi-même :wink: