Renommer fichier php

ph38
Invité n'ayant pas de compte PHPfrance

29 mars 2011, 10:13

Bonjour,
Je cherche à pouvoir renommer une photo lors de l'upload de celle ci avec un input par exemple
J'ai déja le code pour uploader la photo (il marche trés bien)

Code : Tout sélectionner

// copie du fichier si aucune erreur ! if(!isset($erreurs) or empty($erreurs)) { $dest_fichier = basename($_FILES['photo']['name']); $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝà áâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); // un chtit regex pour remplacer tous ce qui n'est ni chiffre ni lettre par "_" $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier); // pour ne pas ecraser un fichier existant while(file_exists($dest_dossier . $dest_fichier)) { $dest_fichier = rand().$dest_fichier; } // copie du fichier if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier)) { $valid[] = "Image uploadé avec succés (<a href='".$dest_dossier . $dest_fichier."'>Voir</a>)"; $erreurs[] = "Impossible d'uploader le fichier.<br />Veuillez vérifier que le dossier ".$dest_dossier." existe avec un chmod 755 (ou 777)."; } } } ?> <form method="POST" action="" enctype="multipart/form-data"> <?php if(!empty($erreurs)) { echo '<ul class="erreur">'; foreach($erreurs as $erreur) { echo '<li>'.$erreur.'</li>'; } echo '</ul>'; } if(!empty($valid)) { echo '<ul class="validation">'; foreach($valid as $text) { echo '<li>'.$text.'</li>'; } echo '</ul>'; } ?> <fieldset> <legend>Envoi d'image</legend> <p> <label for="photo">Image : </label> <input type="file" name="photo" id="photo" /> <input type="text" name="nomf" value="<?php echo $dest_fichier; ?>" /> </p> <p> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $taille_max; ?>" /> <input type="submit" name="envoi" value="Envoyer l'image" /> </p> </fieldset> </form>
Pouvez vous m'aider?
merci
ph38

Eléphant du PHP | 92 Messages

29 mars 2011, 10:25

Hello,

Pour info dans le futur quand tu postes sur le forum ça serait sympa de dire quel est le problème (genre constat de ce qu'il se passe et qu'est ce que tu voudrais que ça fasse en fait.)
Bon dans ton cas je pense comprendre que tu veux déposer le fichier sur le serveur en supprimant les caractères spéciaux du nom du fichier.
Et en plus tu rajoutes une chaîne de caractères aléatoire au début pour être sûr que le fichier n'est pas en double sur le serveur.

Alors du coup pourquoi ne pas générer directement un nom de fichier aléatoire ?
C'est une pratique qui est communément utilisée sur internet.
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

ph38
Invité n'ayant pas de compte PHPfrance

29 mars 2011, 10:52

Bonjour,
En fait je cherche à renomme le fichier avec un nom que je choisis, et non pas un nom aléatoire, pour pouvoir ensuite l'afficher à coté de la photo
Je pense que ca se passe dans move_uploaded_file mais le probleme c'est que je ne sais pas comment récupérer l'info d'un input pour pouvoir le mettre
if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . Valeur input)) {

Mammouth du PHP | 672 Messages

29 mars 2011, 11:08

Bonjour,
En fait je cherche à renomme le fichier avec un nom que je choisis, et non pas un nom aléatoire, pour pouvoir ensuite l'afficher à coté de la photo
Je pense que ca se passe dans move_uploaded_file mais le probleme c'est que je ne sais pas comment récupérer l'info d'un input pour pouvoir le mettre
if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . Valeur input)) {
En général, on dissocie le nom du fichier du titre de l'image - ne serait-ce que parce que le nom du fichier peut avoir des limitations (pas d'accents ou d'espaces, par exemple).
Par exemple, on peut utliser une table IMAGES (id_image#, nom_fichier, titre, commentaire, autre)
Eventuellement, tu peux aussi te contenter d'un fichier texte, genre CSV :
nom_fichier;titre;autre

Sinon, à la base il faut :
1. Rajouter un input dans ton formulaire pour saisir le nouveau nom.
2. A la validation, récupérer le champ par un $nouveau_nom = $_POST['nom_input'];
3. Travailler la variable récupérée (sécurisation, élimination des caractères non souhaités, etc.)
4. Renommer le fichier uploadé.

Eléphant du PHP | 92 Messages

29 mars 2011, 11:10

Grillé :p
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

ViPHP
AB
ViPHP | 5818 Messages

29 mars 2011, 19:08

Oui si tu veux un commentaire complet (permettant tous les caractères) associé à tes photos, il faut faire un système de correspondance comme indiqué par macgawel

Sinon comme j'avais déjà répondu à une même question en utilisant cette classe d'upload je te redonne le code qui permet de faire ce que tu souhaites.

Pour que cela fonctionne il faut copier le code de la classe (qui se trouve en bas du premier message du lien ci-dessus) dans un fichier que tu nommeras "Upload.php" et de renseigner dans le code ci-dessous (en troisième ligne) la variable $repertoire_destination avec ton répertoire de destination.

Cela te permettra de faire rapidement des essais.

Si le nom rentré dans le formulaire ne correspond pas à un nom de fichier valide (sans accents ou caractères spéciaux) cela te renverra un message d'erreur.

Si le nom existe déjà, il sera incrémenté (mais tu pourrais choisir un suffixe aléatoire en remplaçant simplement dans le code ci-dessous la ligne : $form_1->Set_Renomme_fichier ('incr'); par $form_1->Set_Renomme_fichier ();)

La classe gère aussi d'autres erreurs : fichiers dépassant les limites autorisées, mauvaises extensions, images non valides.
<?php
require('Upload.php'); 

// FORMULAIRE 1

$repertoire_destination = 'Test';

// Déclaration de la classe avec envoi des paramètres
$form_1 = new Telechargement ($repertoire_destination,'formulaire_1','photo','get_formulaire_1');


//nommage du fichier suivant le post nom
$nom_fichier = isset($_POST['nom']) && trim($_POST['nom'])!='' ? $_POST['nom'] : 'sans_nom';
$form_1->Set_Nomme_fichier ($nom_fichier,'ext_fichier_telecharge','erreur_mes_info');


// option pour mémoriser le dernier nom, (session_start() est initialisé dans la classe d'upload)
$_SESSION['nom_fichier'] = isset($_SESSION['nom_fichier'])?  $_SESSION['nom_fichier'] : $nom_fichier; 
$_SESSION['nom_fichier'] = isset($_POST['nom'])?  $_POST['nom'] : $_SESSION['nom_fichier'];


//Renommage du fichier avec incrément si un fichier de même nom est déjà existant sur le serveur
$form_1->Set_Renomme_fichier ('incr');


// Contrôle que le fichier est effectivement une image de type gif, jpg, jpeg ou png et retourne ses dimensions dans le tableau des résultats
$form_1->Set_Controle_dimImg ();


//Téléchargement sans traitement php supplémentaire -> on spécifie un rechargement de la page suite au téléchargement en indiquant un argument non nul ex 'reload' dans la fonction d'Upload.
$form_1->Upload('reload');


// Enregistrement des messages de contrôle (si besoin)
$messages_form1 = $form_1->Get_Tab_message ();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
<script type="text/javascript">
<!--
function Verif_attente(id_attente)
    {              
        var id_attente = document.getElementById(id_attente);
       
        if (typeof id_attente != 'undefined')
        {
            // Nettoyage de l'élément cible
            var nb_noeuds = id_attente.childNodes.length;
                       
            for (var i = 0; i < nb_noeuds; i++)        
                                {                                  
                                        id_attente.removeChild(id_attente.firstChild);
                                }
                       
                        id_attente.style.fontWeight="bold";
                id_attente.style.fontSize="1.5em";
                       
            var texte = 'Patientez...';
            // Création du noeud texte
            var noeud_texte = document.createTextNode(texte);
            // Insertion du noeud texte
            id_attente.appendChild(noeud_texte);
        }
    }
-->
</script>
<style type="text/css">
body {
font-family: Arial, Helvetica, sans-serif;
font-size:12px;
}

p, input, form {
margin:0;
padding:0;
}
</style>
</head>

<body>

<div style="width:650px;margin:auto;margin-top:50px;">  

        <p>Fichiers photos (png, jpg, jpeg, gif)</p>
               
        <form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_formulaire_1=1'?>" method = "post" onsubmit = "Verif_attente('message_tele')" id = "formulaire_1">
       
                <p>      
                        <!-- input d'identification du formulaire qui doit être passé en paramètre dans l'initialisation de la classe-->
                        <input type = "hidden" name = "formulaire_1" value = "1" />
                                                 
                        <!-- Par défaut MAX_FILE_SIZE = Return_Octets(ini_get('upload_max_filesize') donc ne sert à rien en l'état. Pour limiter l'upload à une taille inférieure vous pouvez rentrez une valeur suivie de son unité, exemple $form_1->Return_Octets('500K') pour 500 kilos octets, $form_1->Return_Octets('1M') pour 1 méga octets etc. La fonction "Return_Octets" est employée pour la conversion en octets car le champ MAX_FILE_SIZE demande une valeur en octets. -->
       
                        <input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo isset($form_1)? $form_1->Return_Octets(ini_get('upload_max_filesize')) : ''?>" />
                                   
                        <input name = "photo" type = "file" size = "70" /><br />
                                   
                        nom <input name = "nom" type = "text" size = "40" value = "<?php echo $_SESSION['nom_fichier']?>" />
                                   
                                         
                        <input type = "submit" value = "Envoyez"  style = "margin-left:5px" />
                </p>
               
    </form>
               
        <p>
        <br />Taille maximum de fichier autorisée par le serveur = <?php echo ini_get('upload_max_filesize').'o'?>.&nbsp;&nbsp;Total maximum pour l'ensemble <?php echo ini_get('post_max_size').'o'?>.
        </p>

    <div id = "message_tele" style="margin-top:20px;">
               
                <?php if (!empty($messages_form1))
           
                foreach ($messages_form1 as $num)
                        {
                                foreach ($num as $value)
                                echo htmlspecialchars($value).'<br />';
                        }
                ?>
    </div>

</div>

</body>
</html>