Page 1 sur 1

Changer d'avatar AJAX|PHP

Posté : 25 avr. 2017, 15:28
par lucieemtl
Bonjour à toutes et à tous,

J'ai un formulaire d'upload d'avatar :

<form action="functions/pdp.php" method="post" enctype="multipart/form-data" id="pdp">
    <label for="file" class="label-file" style="background-image: url('./pdp/<?php echo $_SESSION['prenom']; if($handle = opendir('./pdp/'.$_SESSION['prenom'].'/')) { while(false !== ($entry = readdir($handle))){ if($entry != '.' && $entry != '..' && $entry != 'index.php'){ echo "/".$entry; }}}?>')"></label>
    <input id="file" name="mon_image" class="input-file" type="file">
    <a href="#" id="validPhoto" data-toggle="modal" data-target="#valider" style="display:none;"></a>
</form>

Qui est traité avec de l'ajax :

<script>
$('#pdp').submit(function(event){
    var formUrl = $(this).attr("action");
    $.ajax(
    {
        url : formUrl,
        type: "POST",
        contentType: false,
        cache: false,
        processData:false,
        data: new FormData(this),
        success:function(data, textStatus, jqXHR)
        {
            location.reload();
        }
    });
    event.preventDefault();
});
$('#validPhotoModal').click(function(){
    $('#pdp').submit();
});
</script>

Et du PHP :

<?php
session_start();
if(isset($_FILES['mon_image'])){
    $targetDir = "../pdp/".$_SESSION['prenom']."/";
    $fileName = $_FILES['mon_image']['name'];
    $info = new SplFileInfo($fileName);
    $ext = $info->getExtension();
    $file_titre = 'pdp.'.$ext;
    $targetFile = $targetDir.$file_titre;
    if(file_exists($targetFile)) {
        unlink($targetFile);
        move_uploaded_file($_FILES['mon_image']['tmp_name'],$targetFile);
    }
    move_uploaded_file($_FILES['mon_image']['tmp_name'],$targetFile);
}
else{
    echo "Aucune image sélectionnée";
}
?>
Mon code fonctionne bien à un détail près : quand je change d'extension (c'est à dire que je passe d'un avatar JPG à PNG) l'image n'est pas supprimée (évidemment puisqu'on parle de supprimer un fichier existant à l'extension jpg..) et ainsi le label n'affiche pas correctement la photo de profil puisqu'il existe désormais deux fichiers (hors on lui demande de prendre comme background, l'image contenue dans le dossier pointé).

Quelqu'un saurait comment je pourrais supprimer tous fichiers existants dans un dossier plutôt que pointer vers un ? Je pense que ça pourrait résoudre mon problème non ?

Bonne journée à tous.

Re: Changer d'avatar AJAX|PHP

Posté : 25 avr. 2017, 16:30
par moogli
salut,

le plus simple serait d'avoir un nom de fichier spécifique à l'utilisateur (genre guid) et tu stock en base le nom du fichier. ensuite tu mets tout dans le même répertoire, cela t'évites les problèmes que tu indiques ainsi qu'une arborescence complexe.

sinon la fonction glob va te founir la liste des fichiers dans ton répertoire (tu peux passer un masque en paramètre).

@+

Re: Changer d'avatar AJAX|PHP

Posté : 25 avr. 2017, 17:05
par lucieemtl
Salut, merci de ta proposition. Entre temps je viens d'essayer quelque chose, puis-je avoir ton avis sur ma logique ?

En effet la voici :

<?php
session_start();
if(isset($_FILES['mon_image'])){
	$handle = opendir('../pdp/'.$_SESSION['prenom'].'/');
	while(false !== ($entry = readdir($handle)))
	{ 
		if($entry != '.' && $entry != '..' && $entry != 'index.php')
		{
			$var = count($entry); 
			if($var > 0){
				unlink('../pdp/'.$_SESSION['prenom'].'/'.$entry);
			}
		}
	}
	$targetDir = '../pdp/'.$_SESSION['prenom'].'/';
	$fileName = $_FILES['mon_image']['name'];
	$targetFile = $targetDir.$fileName;
	move_uploaded_file($_FILES['mon_image']['tmp_name'],$targetFile);
}
?>

Lorsque le formulaire d'upload est soumis, si on récupère bien le champ "mon_image", on va d'abord supprimer ce qui existe dans le dossier de photo de profil, pour ensuite y placer l'image téléchargée.
Ainsi, à chaque nouvel upload, l'image précédente sera systématiquement effacée, et la nouvelle systématiquement insérée.
Bon, elle ne sera plus nommée pdp, mais je pense que cela ne posera pas de problèmes s'il s'agit d'un autre admin, puisque qu'à chaque fois on s'intéresse justement au sous-dossier de "pdp" portant le même nom que l'administrateur connecté (avec $_SESSION['prenom']).


Alors, pas mal ?

Re: Changer d'avatar AJAX|PHP

Posté : 25 avr. 2017, 18:06
par moogli
vérifie quand même que soit conforme à tes attente avant de supprimer l'ancien ;)
tu peux utiliser aussi la fonction is_uploaded_file

pour le reste je pense que c'est une bêtise d'utiliser le prénom du mec pour cela, s'il y en a deux identique boom.
c'est simple de gérer un nom unique (j'ai oublié de dire tout a l'heure que tu peux aussi utiliser l'id du membre pour nommer le fichier ça tu est certain de l'unicité).

après c'est toi qui vois, mais moi j'y vois une source d'emmerde a plus ou moins long terme (bon si y a qu'une personne pas de soucis a deux ou trois faut pas avoir de bol mais c'est une éventualité, plus c'est c'est tendu).

de manière générale se baser sur les données pour ce genre de chose c'est risqué ;)

@+

Re: Changer d'avatar AJAX|PHP

Posté : 26 avr. 2017, 10:00
par lucieemtl
Et bien en effet j'ai fais quelques tests et oui ça répond à mes attentes.
Mais il n'y aura jamais deux administrateurs identiques car je travaille dans une PME, et dans la conception du site, c'est moi seulement qui gère la création d'administrateurs (à la main tout ça !).
De la même façon, je vais d'ailleurs utiliser le prénom pour aller à la page profil (un peu une page portfolio) donc bon..

Pourquoi ce serait risqué alors dans ce cas ? :/

Re: Changer d'avatar AJAX|PHP

Posté : 26 avr. 2017, 10:48
par moogli
ben tu limite un peu l'entreprise si les critères d'embauche doivent tenir compte du prénom : ah ba non on a déjà un bruno / henri ou kévin désolé !!!
Par exemple dans mon ancien bureau il y avait deux gars avec le même prénom face à face ...

dans ce cas il y a des risques d'erreur d'aiguillage (bon ben tu va être bruno2 et on va faire attention à pas oublier le deux).

Ajoute un dernier paramètre : peut être qu'un jour tu ne gérera plus la chose (quelque en soit raison) et la oups ça marche plus.

c'est pour cela que travailler sur des données que tu maîtrises est préférable.

Alors oui ça fait bien d'avoir le prénom et ou le nom dans l'url, mais cela ne devrait être qu'indicatif.
par exemple /profile/1-dupond_durand, /profile/2-gerard_lambert ... => ré écriture d'url pour ne garde que le chiffre vers profile.php?id=$1
et tu récupères les données à partir de l'id de la personne.
pas collision ou d'erreur possible c'est clair et ne portera pas a confusion.

si tu fait quelque chose de générique à la base tu va gagner du temps dans le futur ;)


@+

Re: Changer d'avatar AJAX|PHP

Posté : 09 mai 2017, 16:12
par lucieemtl
De ce point de vue là..
Le tout est de finir le projet, je tiendrais compte de ces améliorations à apporter vivement, merci beaucoup !