Gestion d'images en PHP

Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai réalisé une gestion d'images en PHP qui permet d'ajouter une image dans un dossier "images", et qui permet ensuite de l'afficher sur une page.
Cependant, j'ai 3 aspects que je n'arrive pas à résoudre :

- faire en sorte que la dernière image postée apparaissent en premier (avec un système de trie ?) ;
- pouvoir uploader des images avec des accents, espaces et numéros (car l'image ne s'affiche pas si le nom du fichier comporte tout cela);

- et enfin limiter le nombre d'images par page !

Cela fait beaucoup, mais j'avoue que je suis encore débutant pour me débrouiller tout seul ...
Merci beaucoup pour vos éventuelles réponses !

Je peux éventuellement poster des bribes de script pour plus de clarté !


A voir également:

8 réponses

Boa
 
Hello !

Tu as dû mal programmer à un moment, notamment pour les accents qui ne passent pas.

Des pistes :
- Encode toujours tes fichiers en utf-8 (sans bom)
- Utilise notepad++ pour éditer tes programmes (pour modifier l'encodage facilement)
- Sépare toujours bien ton html de ton php, sinon ça devient vite laid


Pour trier par ordre d'upload, plusieurs pistes également :
- utilise la date de création du fichier (cf. filemtime : http://php.net/manual/fr/function.filemtime.php )
OU
- compte le nombre d'images déjà présentes, et préfixe le nom de l'image à uploader par ce chiffre. Du coup chaque image sera numérotée.
OU
- Utilise une base de données, où tu pourras par la suite stocker plus d'infos liées aux images (qui a rajouté l'image par exemple), en plus de la date d'ajout.

Bref c'est assez varié.

Pourrai-je voir le code HTML généré pour l'affichage de ces images? Notamment le cas où il y a un espace, un accent, etc.

Bon courage !
1
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Il y a trop de sources, je ne trouve pas de solutions...quelqu'un pour m'éclairer la lanterne ?

Merci à vous !
0
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonsoir Boa,
tout d'abord merci pour ta réponse rapide !
Pour l'encodage j'avais essayé mais sans succès (j'ai trouvé un bout de code

$nom = strtr($nom,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$nom = preg_replace('/([^.a-z0-9]+)/i', '-', $nom);

mais je ne sais pas où le placer...

Voilà donc mes deux pages php ==> accueil.php (là où je charge et affiche les images) et ensuite imgClass.php (là où les fonctions opèrent)

accueil.php

<?php
if(!empty($_FILES)){
require("imgClass.php");
$img = $_FILES['img'];
$ext = strtolower(substr($img['name'],-3));
$allow_ext = array("jpg",'png','gif');
if(in_array($ext,$allow_ext)){
move_uploaded_file($img['tmp_name'],"images/".$img['name']);
Img::creerMin("images/".$img['name'],"images/min",$img['name'],215,112);
Img::convertirJPG("images/".$img['name']);
}
else{
$erreur = "Votre fichier n'est pas une image";
}

}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>GEOFFREY PERALES | Portfolio</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="icon" type="image/png" href="../../img/favicon.png" />
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="../../design.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<!-- TinyMCE -->
<script type="text/javascript" src="../../Javascript/tiny_mce/tiny_mce.js"></script>
</head>

<body>

<div id="corps">



<h3>Ajoute tes créations ici !</h3>

<?php
if(isset($erreur)){
echo $erreur;
}

?>
<form method="post" action="accueil.php" enctype="multipart/form-data">
<input type="file" name="img"/>
<input type="submit" name="Envoyer"/>
</form>
<br/><br/>

<?php
$dos = "images/min";
$dir = opendir($dos);
while($file = readdir($dir)){
$allow_ext = array("jpg",'png','gif');
$ext = strtolower(substr($file,-3));
if(in_array($ext,$allow_ext)){
?>
<div class="min">
<a href="images/<?php echo $file; ?>" class="zoombox zgallery">
<img src="images/min/<?php echo $file; ?>"/>
</a>
</div>
<p><a href="suppr_accueil.php?file=<?php echo $file; ?>">supprimer image</a></p><br /> <br /> <br/><br /> <br/>
<?php
}
}
?>

</div><!-- fin de la div corps -->


</div> <!-- fin de div page-->
</body>
</html>




et imgClass.php



<?php

class Img{

function creerMin($img,$chemin,$nom,$mlargeur=100,$mhauteur=100){
// On supprime l'extension du nom
$nom = substr($nom,0,-4);
// On récupère les dimensions de l'image
$dimension=getimagesize($img);
// On cré une image à partir du fichier récup
if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }
else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); }
else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); }
// L'image ne peut etre redimensionne
else{return false; }

// Création des miniatures
// On cré une image vide de la largeur et hauteur voulue
$miniature =imagecreatetruecolor ($mlargeur,$mhauteur);
// On va gérer la position et le redimensionnement de la grande image
if($dimension[0]>($mlargeur/$mhauteur)*$dimension[1] ){ $dimY=$mhauteur; $dimX=$mhauteur*$dimension[0]/$dimension[1]; $decalX=-($dimX-$mlargeur)/2; $decalY=0;}
if($dimension[0]<($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mlargeur*$dimension[1]/$dimension[0]; $decalY=-($dimY-$mhauteur)/2; $decalX=0;}
if($dimension[0]==($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mhauteur; $decalX=0; $decalY=0;}
// on modifie l'image crée en y plaçant la grande image redimensionné et décalée
imagecopyresampled($miniature,$image,$decalX,$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
// On sauvegarde le tout
imagejpeg($miniature,$chemin."/".$nom.".jpg",90);
return true;
}
function convertirJPG($img){
// On cré une image à partir du fichier récup
if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }
else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); }
else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); }
// L'image ne peut etre redimensionne
else{return false; }
imagejpeg($image,substr($img,0,-3)."jpg",90);
}
}

?>



Encore merci ! Je vais regarder pour tes conseils pour l'instant ! Bonne nuit
0
Boa
 
Une autre piste rapide : Vu que tu passes les noms de fichiers dans les liens, en GET, je te conseille d'encoder le nom du fichier en URL avec urlencode() : http://www.php.net/manual/fr/function.urlencode.php

Le PHP ne gère l'utf-8 et les caractères spéciaux que récemment. Ainsi à la place d'utiliser substr, par exemple, il faudra utiliser mb_substr : http://www.php.net/manual/fr/function.mb-substr.php Et en haut de ton script il faudra définir l'encodage : http://www.php.net/manual/fr/function.mb-internal-encoding.php Vérifie que chaque fonction manipulant les chaînes de caractère est bien compatible en utf-8.

Il peut aussi être utile de supprimer directement les caractères spéciaux, vu que le nom de fichier ne pourra par exemple jamais comporter '/' ou ':'. Une simple regex du genre preg_replace('/[^a-zA-Z0-9_-]/', '_', $fichier) pourra suffire.

Mais il est quand même bon de savoir utiliser les accents, tu les rencontreras dans bien d'autres cas. =)

bonne nuit !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai essayé tes pistes mais j'avoue que je rame un peu.
L'utf-8 est bien configuré (je code sur Smultron)

Finalement, je ne sais pas où il faut placer les fonctions urlencode, le preg_replace, etc. Sur accueil.php ou sur imgClass ?

Encore merci !
0
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai trouvé pour tout ce qui est de l'encodage, c'était une faute de frappe...

Il me reste encore la pagination de 3 images par pages et faire apparaitre la dernière image postée en début de liste.

S'il y a quelqu'un, merci !
0
Boa_67 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Si tu fais de l'utf-8 modifie aussi le charset :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

deviendra
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Pour preg_replace, met le sur le nom de l'image, une fois au départ, par exemple directement dans $img['name']
$img['name'] = preg_replace('/[^a-zA-Z0-9_-]/', '_', $img['name']);


Urlencode est à placer sur les url, donc par exemple autour de $file ici :
<img src="images/min/<?php echo $file; ?>"/>

ou ici

href="images/<?php echo $file; ?>"

Il doit y avoir d'autres endroits, je n'ai pas vérifié.
0
Alexandre31000 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Je viens de modifier ça et effectivement ça marche ! le charset a enlever les caracteres sur l'ensemble de la page.

Je continue sur le reste, merci Boa, toujours présent malgré mes lacunes...
0