IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload et renommage des fichiers


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Upload et renommage des fichiers
    Bonjour

    suite à cette source : Upload de gros fichiers par fragments (chunk) (ABCIWEB)


    Je viens de tester les différentes version et le script est super bien, par contre je n'arrive pas à trouver comment renommer automatiquement le fichier une foi envoyé.
    Par exemple:
    L'utilisateur envoi un fichier toto.jpg
    Il faut qu'il soit renommé automatiquement en 5695.jpg
    L'utilité est d’éviter les doublons dans le dossier (chaque nom de fichier aura un nom unique généré par une variable (numéro d'utilisateur).

    Merci encore de ton aide.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Côté php, on peut définir l'adresse de destination du fichier dans la fonction Transfert(). Regardes le fichier d'exemple "UploadAjaxABCI.php" et son fichier serveur "UploadAjaxABCI_Upload.php" qui renomme les fichiers en cas de doublon sur le serveur, tu vois que la nouvelle adresse du fichier est passée dans la fonction Transfert(), et si tu ne passes aucun paramètre dans cette fonction elle utilise par défaut l'adresse : $dossier_destination.$nom_du_fichier_nettoye.

    Dans mes exemples les dossiers de destination sont à l'intérieur du dossier "Upload-Ajax-ABCI". Mais si par exemple ton dossier se nomme PHOTO et qu'il est situé au même niveau que le dossier "Upload-Ajax-ABCI", il faut remonter deux fois dans l'arborescence des dossiers pour définir l'adresse du dossier, soit en principe :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Adresse du dossier de destination par rapport au dossier Php_Upload. 
    $dossier_destination = '../../PHOTO/';
     
    // Ensuite il te suffit de définir un nom pour ton fichier. Si tu utilises un numéro utilisateur prédéfini il est sans doute dans une variable de session que tu peux récupérer.
    session_start();
    $num_utilisateur = isset($_SESSION['num_utilisateur'])? $_SESSION['num_utilisateur'] : null;
     
    // Adresse finale
    $destination_fichier = $dossier_destination.$num_utilisateur.'.jpg';
     
    // Et plus loin dans ton code
    $up->Transfert($destination_fichier);

    Remarques que tous tes fichiers doivent être des fichiers jpg ou jpeg. Si l'on devait accepter les extensions "png" il faudrait récupérer l'extension pour créer le nom du fichier. En reprenant pour exemple le code serveur du fichier UploadAjaxABCI_Upload_Basique_Controle.php, le code complet donnerait :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
    $dossier_destination = '../../PHOTO/';
     
    // Par sécurité on n'autorise que certaines extensions
    $ext_ok = ['.jpg','.jpeg','.png'];
     
     
    // Pour récupérer les variables de session
    session_start();
     
    header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
     
    // Charge les classes  php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
     
    // Configuration de la classe d'upload avec un tableau
    $config = [
    	'dossier_destination' => $dossier_destination
           ,'extensions' => $ext_ok
    ];
     
    // Initialisation de la classe php d'upload
    $up = new UploadAjaxABCIServeur($config);
     
     
    // getParam("uniqid_form") renvoie l'identifiant de formulaire pour la vérification ci-dessous
    $uniqid_form = $up->getParam("uniqid_form");
     
    // Il est conseillé de ne pas supprimer cette ligne car c'est le token qui assure que ce script est appelé depuis le formulaire. Permet également de renvoyer un message en cas de timeout du serveur, connexion perdue ou non valide.
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token'])))
    {
    	$up->exitStatusErreur(SetMessages::get('UpAbVerifToken')); 
    }
     
    // Vérifie que la session utilisateur existe sinon on sort en envoyant un message d'erreur
    $num_utilisateur = isset($_SESSION['num_utilisateur'])? $_SESSION['num_utilisateur'] : null;
    if(!isset($num_utilisateur))
    {
            $up->exitStatusErreur("Votre numéro d'utilisateur n'est pas défini"); 
    }
     
     
    // Vérifie qu'un fichier ou qu'un fragment de fichier est joint dans la requête
    if($up->getFragment())
    {
            $nom_fichier_originel = $up->getParam("name");
            $extension_fichier = $up->getExtension($nom_fichier_originel);
     
            $up->Upload();
     
            $destination_fichier = $dossier_destination.$num_utilisateur.'.'.$extension_fichier;
     
            $up->Transfert($destination_fichier);
    }
     
    $up->exitReponseAjax();
    ?>

    Après tu pourrais aussi redimensionner automatiquement les images si besoin en prenant exemple sur les fichiers de redimensionnements.
    Voilà

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup ABCIWEB
    En fait après réflexion, il vaut mieux que le fichier soit renommé automatiquement mais que le nouveau nom soit remonté sur la page de formulaire "UploadAjaxABCI.php"
    Je n'arrive pas à trouver le fonctionnement pour le faire.
    Encore merci

    Code UploadAjaxABCI.php
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <form class="formajaxabci" id="form_files1" action="#" method="post" style="margin-top:2em">
     <fieldset style="color:#900;border:3px solid #900;border-radius:5px;padding:1em">
        <legend>Ajouter un fichier : Images,Word,Excel,PDF</legend>
         <input type="file" multiple="multiple" name="upload" style="display:none">
         <input type="hidden" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">
         <input type="hidden" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">
     
    	 <!-- le bouton personnalisé ci-dessous remplacera le bouton d'upload standard des champs de type file grâce à l'option de configuration "config.customFileSelect" déclarée dans la configuration javascript en bas de page -->
         <input type = "button" value='Charger vos fichiers' class="bouton_fichiers" style="background-color:#CCC;border-radius:7px;height:2.5em;font-size:1.2em;cursor:pointer">
     
         <input type="submit" value="Envoyer" style="color:#900;height:2.5em;border-radius:7px;cursor:pointer">
     </fieldset>
    </form>
     
    <script src="Javascript/jquery.js"></script>
    <!-- UploadAjaxABCI.js est la version minifiée de UploadAjaxABCI_DEV.js -->
    <script src="Javascript/UploadAjaxABCI.js"></script>
     
    <script>
    "use strict"; // Vous pouvez supprimer cette ligne en cas d'utilisation d'autres scripts javascript qui ne supportent pas ce mode.
     
    // Destination de la requête ajax d'upload
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Upload.php';
     
    // FORMULAIRE 1
    var form1 = new UploadAjaxABCI(destination_ajax, '#form_files1', '#reponse_upload1');
     
    // configuration
     
    form1.config.filesExtensions = ['avi','divx','mp4','mkv','mpg','jpg','jpeg','png','gif','xls','xlsx','doc','docx','odt','txt','zip','7zip','rar']; // Extensions autorisées (un contrôle de sécurité supplémentaire est fait côté serveur). Inutile de mettre les variantes en majuscules.
     
    form1.config.customFileSelect = ".bouton_fichiers";// Je souhaite remplacer les boutons standards de sélection de fichiers du navigateur par des boutons personnalisés dont j'indique l'identifiant (ici une classe) dans cette option. 
     
    // Démarrage DOM chargé
    $(function(){form1.Start()});
     
     
     
     
     
    /*
    Pour mettre une séparation qui indique la provenance des fichiers suivant le bouton de sélection, voir un exemple dans "UploadAjaxABCI_Crop_multiple_multiple.php" (méthode "config.func_FileSelectAll").
    */
     
    // Démarrage DOM chargé
    $(function(){form2.Start()});
     
     
     
     
     
     
    // Démarrage DOM chargé
    $(function(){form4.Start()});
     
     
     
     
    // Démarrage DOM chargé
    $(function(){form6.Start()});
     
    </script>
    UploadAjaxABCI_Upload.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    <?php 
    $dossier_destination1 = '../Upload1/'; 
    session_start();
    header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
     
     
    // Charge les classes php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
     
    $up = new UploadAjaxABCIServeur($dossier_destination1);
     
    // getParam("uniqid_form") renvoie l'identifiant unique (token) du formulaire.
    $uniqid_form = $up->getParam("uniqid_form");
     
    // Il est conseillé de ne pas supprimer cette ligne car c'est le jeton de sécurité (token) qui assure que ce script est appelé depuis le formulaire. Permet également de renvoyer un message en cas de timeout du serveur, connexion perdue ou non valide.
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token']))) $up->exitStatusErreur(SetMessages::get('UpAbVerifToken'));
     
     
    // getFragment() retourne true si un fichier (ou un fragment de fichier) est joint au formulaire, sinon false
    $fichier_en_cours = $up->getFragment();
    if($fichier_en_cours)
    {
    	// getParam("name") retourne le nom originel du fichier
    	$nom_fichier_originel = $up->getParam("name");
     
    	// getCleanFileName() retourne le nom du fichier nettoyé après suppression/remplacement des caractères spéciaux
    	$nom_fichier_nettoye = $up->getCleanFileName();
     
    	// getParam("id_form") retourne l'identifiant html du formulaire (#id ou .classe)
    	$id_form = $up->getParam("id_form");
     
    	// getParam("input_name") retourne le nom du champ de type file
    	$nom_input = $up->getParam("input_name");	
     
    	// On vérifiera les extensions avec la méthode "verifExtensions" car ce script traite différents formulaires. Si le paramètre passé à la méthode est un tableau vide, la vérification ne sera pas faite.
    	$filesExtensions = ['avi','divx','mp4','mkv','mpg','jpg','jpeg','png','gif','xls','xlsx','doc','docx','odt','txt','zip','7zip','rar'];
     
    	// Vérifie si l'extension du fichier correspond à un élément du tableau. La méthode "verifExtensions" prend en parramètre le nom du fichier et le tableau d'extensions autorisées et retourne true ou false. Si false on sort du script en envoyant un message dans le status html du fichier.
    	$verifExtensions = $up->verifExtensions($nom_fichier_nettoye, $filesExtensions);
    	if($verifExtensions == false) 
    	{
    		// Utilisez la fonction "exitStatusErreur ($value)" pour sortir du script en ajoutant un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status"
    		$up->exitStatusErreur(SetMessages::get('UpAbExtensionFichier'));
    	}	
     
         // Renommage des fichiers
    	 // Plutôt que de renommer le fichier en cas de doublon sur le serveur comme je le fais plus bas avec la méthode "renameIdenticName()", on pourrait sortir du script avant d'employer la méthode "Upload()" et envoyer un message d'erreur en faisant :
    	 /*
    	if(is_file($destination_fichier))
    	{
    		// J'ajoute le tableau de message nécessaire à l'affichage du message ayant l'index 'ficherExisteDeja' - voir le mode d'emploi "Configuration serveur -> Gestion des messages" - avec new SetMessages('verifFileExist'), car il n'est pas chargé par défaut par les classes php)
    		new SetMessages('verifFileExist');
    		
    		$up->exitStatusErreur(SetMessages::get('ficherExisteDeja'));// "Ce fichier existe déjà"	
    	}
    	*/
     
    	// Si aucune vérification ni renommage n'est fait, les fichiers du serveur ayant le même nom que les fichiers téléchargés seront écrasés.
     
    	// INDISPENSABLE : on doit utiliser la méthode "Upload()" pour réaliser le processus d'upload. 
    	$up->Upload();
     
    	/* Le processus d'upload est dissocié de celui du transfert, pour permettre de traiter le fichier complet (par exemple pour faire des redimensionnements d'images en php) avant de le déplacer vers son emplacement définitif.
    	*/
     
    	// La méthode "getTempAdressFileComplete()" qui doit être utilisée après la méthode "Upload()", retourne l'adresse du fichier temporaire lorsqu'il est complet, sinon false. */
    	if($up->getTempAdressFileComplete())
    	{
    		/* Renommage des doublons avec la méthode "renameIdenticName($destination_fichier)".
    		La fonction de renommage peut-être assez gourmande en ressources si on utilise l'option d'incrémentation (non utilisée ici). Inutile de l'employer pour chaque fragment traité par ce script, d'où la condition "if($up->getTempAdressFileComplete())" qui permet de ne l'appliquer que lorsque le fichier est complet.
    		- Plus d'infos sur cette méthode dans le mode d'emploi section "Configuration Serveur", paragraphe "Méthodes de la classe UploadAjaxABCIServeur".*/
     
    		$destination_fichier = $up->renameIdenticName($destination_fichier);
    		// Si vous préférez écraser les fichiers existants il suffit de supprimer la ligne ci-dessus
    	}
     
    	/* INDISPENSABLE : on utilise la méthode "Transfert()" après la méthode "Upload()", avec comme argument optionnel la destination du fichier. Retourne true en cas de succès, sinon false. 
    	La méthode "Transfert()" déplace le fichier temporaire vers son emplacement définitif et supprime le cookie de sauvegarde identifiant ce fichier. Elle renseigne également des paramètres qui seront exploités par le reour ajax. Si vous ne souhaitez pas utiliser cette méthode voir le mode d'emploi : section "Configuration Serveur", paragraphe "Upload sans Transfert".
    	*/
    	$transfert = $up->Transfert($destination_fichier);
    	/* note: 
    	- Ici, on aurait logiquement pu mettre cette ligne à l'intérieur de la condition "if($up->getTempAdressFileComplete() != false)". Je la met ici pour montrer que la méthode "Transfert" fait automatiquement cette vérification.
    	*/
     
    	//Si l'on doit indiquer les droits d'accès du fichier, par exemple 604, on pourrait faire
    	/*if($transfert && !@chmod($destination_fichier,0604))
    	{
    		// Efface le fichier et envoie un message si erreur
    		unlink($destination_fichier);
    		$up->exitStatusErreur(SetMessages::get('UpAbConfigChmod'));
    	}*/
    }
     
    /* 
    INDISPENSABLE : La méthode "exitReponseAjax()" doit être appelée en fin de script et APRES l'utilisation de la méthode "Transfert()" pour retourner les informations nécessaires à la requête Ajax. 
    
    Entre l'utilisation de ces deux méthodes, on peut réaliser d'autres opérations, par exemple :
    */
     
    // "getTransfertOk()" à utiliser après la méthode "Transfert()", renvoie true si le fichier complet a été déplacé avec succès vers son emplacement définitif, sinon false (alternativement on pourrait tester le retour de la méthode "Transfert()").
    if($up->getTransfertOk())
    {
    	// C'est dans cette condition qu'il conviendrait par exemple d'enregistrer la destination du fichier en bdd
    	/*
    		$bdd_ok = enregistrement du nom ou de la destination du fichier en bdd...
    	*/
     
    	// Et par exemple envoyer un message de confirmation dans le statut du fichier
    	/*
    	if ($bdd_ok) 
    	{
    		//Utilisez la méthode "addStatusOk($value)" si vous souhaitez envoyer des messages qui seront concaténés au statut "info.status.ok" (de la classe javascript) qui renseigne le bloc html ayant la classe "UpAbci_status". Par exemple :
    		$up->addStatusOk(", enregistrement en bdd ok.");
    		// affichera "Téléchargement ok, enregistrement en bdd ok." si vous n'avez pas modifié la valeur de "info.status.ok" dans la configuration javascript.
    	}
    	*/
     
    	// Dans le cas des formulaires n°6 et n°7 le message javascript "info.status.ok" a été configuré vide. On souhaite uniquement afficher un message textuel si le fichier a été renommé (qu'il ait été nettoyé ou renommé à cause d'un doublon sur le serveur)
    	if (isset($id_form, $destination_fichier, $nom_fichier_originel) && ($id_form == '#form_files5' || $id_form == '#form_files6'))
    	{
    		// On ne doit pas utiliser la variable "$nom_fichier_nettoye" précédemment définie pour faire la comparaison avec le $nom_fichier_originel car le nom du fichier peut aussi être modifié en cas de doublon sur le serveur puisque j'utilise $up->renameIdenticName() prédédemment. 
     
    		$nom_final = pathinfo($destination_fichier, PATHINFO_FILENAME);
    		$extension_fichier = pathinfo($destination_fichier, PATHINFO_EXTENSION);
    		$nom_final = trim($extension_fichier) != '' ? $nom_final.'.'.$extension_fichier : $nom_final;
     
    		if ($nom_fichier_originel != $nom_final)
    		{
    			$up->addStatusOk(SetMessages::get('UpAbRenomme').':&nbsp;'.$nom_final);
    		}
    	}
    }
     
     
     
    // On peut retourner directement des informations texte ou html dans le bloc html ayant la classe "UpAbci_infosServer" en utilisant la méthode "addInfosServer ($value)". Ici je choisi de faire afficher un message si aucun fichier n'est joint lors de l'envoi du formulaire.
    if (!$fichier_en_cours) 
    {
    	$up->addInfosServer(SetMessages::get('UpAbAucunFichierTraite'));// SetMessages::get('UpAbAucunFichierTraite') renvoie "Aucun fichier traité"
    }
    // Notez qu'il existe une méthode nommée addMixteServer() qui permet d'envoyer tout type de contenu (tableau, texte ou html) dans le troisième paramètre des méthodes javascript événementielles "config.func_FileEndEach()" et "config.func_FormEnd()", afin de pouvoir  exploiter ce contenu en javascript.
     
     
     
    // *INDISPENSABLE dans tous les cas : Envoi des informations nécessaires pour terminer le script javascript avec "exitReponseAjax()"
    $up->exitReponseAjax();
    ?>

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par gachetg35 Voir le message
    Merci beaucoup ABCIWEB
    En fait après réflexion, il vaut mieux que le fichier soit renommé automatiquement mais que le nouveau nom soit remonté sur la page de formulaire "UploadAjaxABCI.php"
    Je n'arrive pas à trouver le fonctionnement pour le faire.
    Renommé automatiquement comment ? Comme dans les exemples qui renomment les fichiers en ajoutant un suffixe unique, ou avec simplement le numéro identifiant de l'utilisateur (que tu devrais avoir dans une variable de session), ou encore avec le nom du fichier + le numéro identifiant de l'utilisateur comme suffixe ?
    Et as-tu ce numéro identifiant dans une variable de session ?

    Donnes-moi tout le processus détaillé et les variables dont tu disposes si tu veux que je t'aide, car et je ne vais pas recommencer cinquante fois alors que tu as tous les élements pour le faire toi-même. Aussi tu as supprimé des lignes dans le code que tu donnes dans le premier script mais tu en a laissé certaines qui vont forcément produire un bug, notamment les lignes$(function(){form2.Start()}); $(function(){form4.Start()});$(function(){form6.Start()}); dont les variables form2, form4 et form6 ne sont maintenant plus définies.

    Prends du temps afin de définir le meilleur processus pour enregistrer tes photos en fonction de l'utilisation ultérieure, car je ne vais pas refaire le code cinquante fois.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    En fait, j'ai une page de formulaire qui crée des ticket d'assistance,

    1er étape

    Page ajout de ticket avec (en simplifiant pour l'exemple) une saisie de texte et l'upload fichier.
    (A cet étape, je ne connais pas encore le numéro de ticket d'assistance.)
    Il me faudrait donc le nom complet du fichier uploadé que je l'ajoute à mon formulaire de saisie de texte avec une variable hidden.

    2eme étape
    Envoi du formulaire vers ma page php qui ajoute le ticket à la bdd ( et qui crée automatiquement un numéro de ticket)
    Dans la bdd il y aura donc le numéro de ticket, le texte du ticket et le nom du fichier avec son extension.

    3eme étape
    Pour visualisé le ticket, je fais ma requette sql qui affiche le texte et le nom du fichier avec l'extension.
    pour visualisé le fichier je n'ai plus qu'à ajouter le lien du serveur devant (<a href="www.xxxx.com/upload/nomfichier.extention"/>)

    Voilà, en resumé

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    @gachetg35 Pourquoi ne pas faire les étapes 1 et 2 en même temps ?

    On peut très bien envoyer un ou plusieurs champs de texte en même temps que des fichiers et renseigner des champs de bdd si les fichiers sont correctement uploadé sans passer par un second formulaire. Quel est l'intérêt de faire deux formulaires plutôt qu'un ?

    Autres questions :
    - l'upload d'un fichier est-il obligatoire pour ouvrir u ticket ?
    - L'utilisateur peut-il uploader plusieurs fichiers pour un même ticket ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    En fait, j'ai 2 choix:
    -Soit je renomme automatiquement le fichier avec le numerodeticket.xxx mais je suis limité à un fichier par ticket et comme le numéro de ticket est défini sur ma page php de requette qui vient après, je ne peux pas renommer le fichier.
    -Soit (le mieux, je pense) Le fichier se renomme automatiquement en nouveunomfichier.extention et est remonté sous forme de variable. Il me faudrait simplement la variable qui me remonte le nouveau nom de fichier dans le formulaire.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Donc tu as un seul fichier par ticket, ok.

    Mais tu n'as pas répondu à ma première question. Tu me dis que tu veux retourner le nom du fichier dans le formulaire pour créer le ticket, mais pourquoi ne pas créer ton ticket dans le même script qui fait l'upload de fichier. Pour quelles raisons veux-tu faire un second script pour l'enregistrement du ticket ?

    A priori tu compliques le processus pour rien. Même si l'upload de fichier n'est pas obligatoire pour ouvrir un ticket, le script peut néanmoins soumettre le formulaire et envoyer toutes les données textuelles que tu veux. C'est d'ailleurs son fonctionnement par défaut d'envoyer le formulaire même en absence de fichier joint (d'où ma seconde question sur l'obligation ou non d'envoyer un fichier pour ouvrir un ticket car on peut configurer la classe d'upload pour que le formulaire ne soit pas envoyé sans fichier joint).

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    L'envoi de fichier n'est pas obligatoire pour créé un ticket.

    Mon code à 11ans d'age en gros j'ai une page pour saisir le formulaire et quand on clique sur un lien envoyer, ça ouvre une 2eme page qui fait la requette sql.
    Le but serait d'avoir le nom du fichier dans la page 1, comme ça si il y a un fichier renommé, je n'ai simplement qu'a mettre le non dans un champ de bdd en page 2.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Si dans ta deuxième page tu n'as que le code du traitement du formulaire, tu pourrais tout aussi bien mettre ce code dans la page d'upload puisque qu'elle est appelée par défaut même si aucun fichier n'est joint. Tous les champs du formulaire seraient également transmis en plus du fichier facultatif et cela ne te ferais qu'un seul formulaire.

    Mais bon si c'est plus simple pour toi de garder le principe actuel, si j'ai bien compris cela fait deux formulaires dans la première page, un pour l'envoi du fichier et un second pour l'envoi des données ? Si c'est bien ça et que tu veux garder ce principe, donnes-moi l'id du champ (dans ce cas il peut-être du type hidden) que tu veux que je complète et j'adapterai le code que je t'ai donné plus haut.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup ABCIWEB

    Je vais faire au plus simple pour moi, donc rester sur mes deux pages différentes.
    Pour l'ID qui remontera sur la page 1, ça sera un input en hidden "piecejointe".
    Dedans, il y aura uniquement le nom du fichier et son extension (fichiers de type word,excel,pdt,image).

    Merci beaucoup

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Les commentaires sont dans le code.

    Code du formulaire qui doit se situer à la racine du répertoire Upload-Ajax-ABCI (au même niveau que les autres fichiers de formulaires)
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    <?php
    /*
    Utilise le fichier "Php_Upload/UploadAjaxABCI_Upload_gachetg35.php" comme destination Ajax
    */
    session_start();
    header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
     
    // Charge les classes php avec spl_autoload_register (ici pour utiliser la classe de services "UploadABCIServices" et ses méthodes "returnOctets" et "getUniqid")
    spl_autoload_register(function ($class) {require 'Php_Upload/Classes/' . $class . '.php';});
     
    $up = new UploadABCIServices();
     
    $UpAbci_fragmentSize = $up->returnOctets('8M'); // Taille maximale des fragments de fichier. Détermine la fréquence de sauvegarde du fichier en cours d'upload (le fichier temporaire est sauvegardé à chaque fragment complet envoyé) et donc le nombre de requêtes ajax nécessaires à l'upload total.
     
    // Vérifie si $UpAbci_fragmentSize n'est pas supérieur aux limites du serveur pour avoir un code générique, pas utile si vous connaissez ces valeurs.
    $upload_max_filesize = min($up->returnOctets(ini_get('upload_max_filesize')), $up->returnOctets(ini_get('post_max_size')));
    $UpAbci_fragmentSize = !empty($UpAbci_fragmentSize) && $upload_max_filesize > $UpAbci_fragmentSize ? $UpAbci_fragmentSize : $upload_max_filesize;
     
    $UpAbci_uniqidForm = $up->getUniqid();
     
    // Jeton de formulaire (token);
    $_SESSION['UploadAjaxABCI'][$UpAbci_uniqidForm]['token'] = 1;
     
    // Configuration des contrôles pour le formulaire et javascript 
    // Taille maximale autorisée
    $max_size = '100 Mo';
     
    // Tableau des extensions autorisées. J'ai mis des points devant les extensions pour compatibilité avec l'attribut "accept". Les contrôles des extensions des classes d'upload javascript et serveur acceptent indifféremment les extensions avec ou sans point et en majuscule ou en minuscules.
    $ext_ok = ['.jpg', '.jpeg', '.png', '.doc', '.docx', '.pdf', '.xls', '.xlc', '.xll', '.xlm', '.xlw', '.xla', '.xlt', '.xld'];
     
    //Je crée une chaine de caractères en ajoutant une virgule pour l'attribut "accept" du champ de type file
    $accept = implode(",",$ext_ok);
     
    // je supprime les "." pour un affichage dans la balise "legend" du formulaire
    $tab_legend = $up->cleanTabExtensions($ext_ok);
    // Et je crée une chaine de caractères en rajoutant une virgule et un espace
    $legend = implode(", ",$tab_legend);
    $legend = '<strong>Extensions autorisées</strong>&nbsp;:&nbsp;'.$legend.', <strong>Taille max</strong>&nbsp;:&nbsp;'.$max_size;
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8">
    <meta name=viewport content="width=device-width, initial-scale=1">
    <title>Basique Upload Ajax ABCIWEB</title>
    <style>
    .UpAbci_infosFile {
    	word-wrap:break-word;	
    }
     
    .UpAbci_infosFile progress { 
    	width:100px;
    }
     
    input[type=submit], input[type=button] {
    	padding:0.3em 1.2em;
    	border-radius:2px;
    	font-size:1.1em;
    	cursor:pointer;
    }
    </style>
    </head>
    <body style="font-family:Arial, Helvetica, sans-serif; font-size:0.9em;max-width:850px;margin:3em auto 0 auto;line-height:1.5em">
     
    <div style="margin-top:1.5em">
    <form id="form_base_controle" action="#" method="post">
     <fieldset style="border:2px solid #999;border-radius:5px;padding:1em">
        <legend><?=$legend?></legend>
         <input type="file" name="upload_base_controle" accept="<?=$accept?>" data-max-size="<?=$max_size?>">
         <input type="hidden" name="UpAbci_fragmentSize" value="<?=$UpAbci_fragmentSize?>">
         <input type="hidden" name="UpAbci_uniqidForm" value="<?=$UpAbci_uniqidForm?>">    
         <input type="submit" value="Envoyer">
     
         <!-- Bloc conteneur du retour d'informations -->
         <div id="reponse_upload">
            <!--information du fichier que l'on affiche uniquement si un fichier est soumis avec le style événementiel "data-upabcicss-select-file", pour éviter la barre de progression graphique vide quand aucun fichier n'est soumis-->
             <div class="UpAbci_infosFile" style="display:none;margin-top:1em;" data-upabcicss-select-file="display:block;">
             	<span class="UpAbci_imgPreview"></span><!-- Prévisualisation des images -->
                <span class="UpAbci_name"></span><!-- nom du fichier -->
                <progress class="UpAbci_progressionG"></progress> <!-- progression graphique -->
                <span class="UpAbci_status" data-upabcicss-result-ok="color:green;font-weight:bold" data-upabcicss-result-error="color:red">en attente</span><!-- pour informer du statut "en cours", "ok", "erreur" ou "arrêt" en fonction de l'état du téléchargement. La mention "en attente" est écrite par défaut et sera remplacée par l'information adéquate durant le téléchargement du fichier. -->
                <span class="UpAbci_stop" style="color:red;cursor:pointer;float:right" data-upabcicss-result="display:none">stop</span>
             </div>
        </div>
     </fieldset>
    </form>
     
    <form action="" method="post" style="margin-top:2em">
    <!-- Ton formulaire (je ne met pas le champ en type hidden mais en type text pour mieux le voir durant le test-->
    <input type="text" name = "piecejointe" id= "piecejointe">
    </form>
    </div>
     
    <script src="Javascript/jquery.js"></script>
    <!-- UploadAjaxABCI.js est la version minifiée de UploadAjaxABCI_DEV.js -->
    <script src="Javascript/UploadAjaxABCI.js"></script>
     
    <script>
    // Destination de la requête ajax d'upload
    var destination_ajax = 'Php_Upload/UploadAjaxABCI_Upload_gachetg35.php'; 
     
    // Initialisation de la classe javascript (destination ajax, identifiant formulaire, identifiant réponse)
    var up = new UploadAjaxABCI(destination_ajax, '#form_base_controle', '#reponse_upload');
     
    // Je récupère la taille maximale et les extensions autorisées dans le formulaire.
    // Récupération de l'input de type file
    var file_form = $('#form_base_controle').find('input[type=file]');
     
    // split crée un tableau en prenant le caractère ',' comme séparateur dans la chaine
    // Mettre la ligne ci-dessous en commentaire pour vérifier le controle des extensions côté serveur
    up.config.filesExtensions = file_form.attr('accept') != undefined ? file_form.attr('accept').split(',') : [];
     
    // Taille maximale autorisée. Mettre la ligne ci-dessous en commentaire pour vérifier le controle de la taille maximale côté serveur
    up.config.fileSizeMax = file_form.attr('data-max-size') != undefined ? file_form.attr('data-max-size') : null;
     
    // On utilise une fonction événementielle pour récupérer le retour serveur et envoyer le nom du fichier renommé dans le champ du second formulaire
    up.config.func_FormEnd = function(tableau, info_serveur, mixte_serveur)
    {
    	$("#piecejointe").val(mixte_serveur);
    }
     
    // Démarrage de la fonction, DOM chargé
    $(function(){up.Start()});
    </script>
    </body>
     
    </html>

    Ce code du formulaire fait donc appel au script d'upload que j'ai nommé "UploadAjaxABCI_Upload_gachetg35.php" et qui doit se situer dans le répertoire "Php_Upload". Voici le code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php
    /*
    CONSULTEZ LE MODE D'EMPLOI POUR L'UTILISATION DES METHODES SERVEUR, BON NOMBRE D'ENTRE ELLES DOIVENT ETRE UTILISEES DANS UN ORDRE PRECIS.
    */
     
    // Vous devez vérifier l'existence du dossier ou changer cette adresse.
    /*-------------------à adpater-----------------------------------*/
    $dossier_destination = '../Destination_Upload1/';
     
     
    // Par sécurité on n'autorise que certaines extensions
    $ext_ok = ['.jpg', '.jpeg', '.png', '.doc', '.docx', '.pdf', '.xls', '.xlc', '.xll', '.xlm', '.xlw', '.xla', '.xlt', '.xld'];
     
    // Et si possible on limite la taille maximale de chaque fichier
    $max_size = '100 Mo';
     
    /*-----------------------------------------------------------------*/
     
    // Pour récupérer la variable de session "$_SESSION['UploadAjaxABCI'][$uniqid_form]" qui fait office de token
    session_start();
     
    header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
     
    // Charge les classes  php avec spl_autoload_register
    spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
     
    $config = [
    	'dossier_destination' => $dossier_destination
    	,'extensions' => $ext_ok
    	,'max_size' => $max_size
    ];
     
    // Initialisation de la classe php d'upload
    $up = new UploadAjaxABCIServeur($config);
     
    $up->setModeDebug ();
     
    // getParam("uniqid_form") renvoie l'identifiant de formulaire pour la vérification ci-dessous
    $uniqid_form = $up->getParam("uniqid_form");
     
    // Il est conseillé de ne pas supprimer cette ligne car c'est le token qui assure que ce script est appelé depuis le formulaire. Permet également de renvoyer un message en cas de timeout du serveur, connexion perdue ou non valide.
    if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]['token'])))
    {
    	$up->exitStatusErreur(SetMessages::get('UpAbVerifToken')); 
    }
     
     
    $up->Upload();
     
    // On nettoie le nom du fichier en remplaçant les espaces et les caractères spéciaux avec getcleanFileName()
    $nom_fichier_nettoye = $up->getcleanFileName();
    $extension_fichier = $up->getExtension($nom_fichier_nettoye);
     
    // On renomme avec un suffixe unique en utilisant getUniqid()
    $nom_fichier_renomme = pathinfo($nom_fichier_nettoye, PATHINFO_FILENAME).'-'.$up->getUniqid(24).'.'.$extension_fichier;
     
    // Destination finale
    $destination_fichier = $dossier_destination.$nom_fichier_renomme;
    $up->Transfert($destination_fichier);
     
    // Si transfert ok
    if($up->getTransfertOk())
    {
    	// Envoie le nom du fichier pour être récupéré dans le troisième paramètre de la fonction javascript config.func_FormEnd
    	$up->addMixteServer($nom_fichier_renomme);
    }
     
     
    $up->exitReponseAjax();
    ?>
    Il faudra modifier $dossier_destination suivant tes besoins.

    Notes que si tu changes les extensions autorisées ou la taille maximale tu dois les changer dans les deux scripts (sinon tu pourrais aussi utiliser une variable de session pour stocker ces valeurs).

    Si besoin, pour externaliser le formulaire par rapport au dossier Upload-Ajax-ABCI, consultes ce paragraphe du mode d'emploi.

    J'ai testé ces scripts et ils sont fonctionnels chez moi, ils devrait donc en être de même sur ton serveur

    Laisses un mot en retour quand tu auras terminé.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Alors pas de nouvelles, bonnes nouvelles ?

    Juste un mot pour dire que j'ai vu plus tard que j'avais laissé la ligne $up->setModeDebug (); dans le code php. Or, comme son nom l'indique, cette ligne n'est utile qu'en phase de développement pour renvoyer les éventuelles erreurs php vers le formulaire.

    Quand tout est ok, il vaut mieux par principe la supprimer ou la mettre en commentaire en phase de production, pour éviter qu'un pirate puisse récupérer des informations en tentant de provoquer volontairement des bug d'une manière ou d'une autre (même si c'est peu probable qu'il puisse récupérer des informations qui lui seront utiles dans ce script).

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Désolé pour le retard, je n'avais pas le temps de me remettre dessus.
    Ton code fonctionne nickel, il me reste 2 ou trois trucs à corriger mais ça vient de moi.
    En tout cas, un GRAND merci à toi.

Discussions similaires

  1. Renommage des fichiers sur ftp
    Par fanah dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 31/03/2009, 12h46
  2. [Upload] le download des fichiers
    Par gabi27685 dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2008, 15h55
  3. Réponses: 14
    Dernier message: 14/03/2007, 19h32
  4. [Upload] Suppression auto des fichiers uploadés
    Par silver.spike dans le forum Langage
    Réponses: 5
    Dernier message: 09/03/2007, 11h27
  5. routine de renommage des fichiers
    Par jeremy.blanche dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/08/2006, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo