Script upload d'image pour phpbb et wiki
Par syeric, mercredi 16 mai 2007 à 15:49 :: PHP :: #3 :: rss
Satut !
Mon camarade de linuxpourlesnuls llooll et moi même avons développé un script qui permet d'uploader une image et d'en générer une miniature, un peu à la manière de rockhosting par exemple. Nous avons fait une version pour phpbb, qui va donner en retour le BBcode à insérer dans un post, et une version wiki (dokuwiki, je sais pas si la syntaxe est la même sur tous les systèmes de wiki) qui permet en plus de choisir la mise en page.
Pour le mettre en place, je vous recommande d'utiliser un ftp différent de votre forum. En effet laisser un moyen d'entrée est toujours délicat. Donc sur ce ftp, free par exemple, il faut créer deux répertoires à la racine, pics et minis, qui vont contenir respectivement les images de taille originale et les miniatures. Il faut ensuite mettre le script ci-dessous, par exemple upload.php, à la racine. Certains champs sont à changer pour votre site ;-) En l'état, seuls png et jpeg sont acceptés. Mais accepter des gifs est facile, je vous laisse le faire ;-) Pour une meilleure lisibilité du code, faites un copier / coller dans un fichier ;-) Une remarque, php n'est pas sensible à l'indentation mais je l'ai fait pour que ce soit plus facile à lire et à déboguer ;-)
<?php //Création de la fonction str_split si PHP < 5 if (!function_exists("str_split")) { function str_split($str,$length = 1) { if ($length < 1) return false; $strlen = strlen($str); $ret = array(); for ($i = 0; $i < $strlen; $i += $length) { $ret[] = substr($str,$i,$length); } return $ret; } } //Récupération du chemin actuel $pos=strrpos($_SERVER['REQUEST_URI'],"/"); $chemin="http://".$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,$pos)."/"; // on défini le répertoire où sont stockées les images de grande taille $dir = 'pics'; // on défini le répertoire où seront stockées les miniatures $dir_mini = 'minis'; // on défini une variable $ratio qui vaudra 150 dans notre cas (150 pixels). En fait, pour nos miniatures, nous allons respecter le ratio de l'image originale, mais nous allons forcer sa taille à 150 pixels, soit en hauteur soit en largeur (tout dépend de l'orientation de notre image : paysage ou portrait). $ratio = 150; $liste = "abcdefghijklmnopqrstuvwxyz0123456789"; $liste=str_split($liste); // on teste si le formulaire permettant d'uploader un fichier a été soumis if (isset($_POST['ok'])==1) { // on teste si le champ permettant de soumettre un fichier est vide ou non if (empty($_FILES['image']['tmp_name'])) { // si oui, on affiche un petit message d'erreur $erreur = 'Aucun fichier envoyé.'; } else { $NomImage = ""; while(strlen($NomImage) != 8) { $NomImage .= $liste[rand(0,35)]; } $file_upload=$NomImage; // on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier (je vous suggère de regarder la documentation de la fonction getimagesize pour de plus amples informations) $tableau = @getimagesize($_FILES['image']['tmp_name']); if ($tableau == FALSE) { // si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur unlink($_FILES['image']['tmp_name']); $erreur = 'Votre fichier n\'est pas une image.'; } else { $extension_fichier = array_pop(explode(".", $_FILES['image']['name'])); $file_upload.=".".$extension_fichier; // on teste le type de notre image : jpeg ou png if ($tableau[2] == 2 || $tableau[2] == 3) { // si on a déjà un fichier qui porte le même nom que le fichier que l'on tente d'uploader, on modifie le nom du fichier que l'on upload if (is_file('pics/'.$file_upload)) $file_upload = '_'.$file_upload; // on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille copy ($_FILES['image']['tmp_name'], $dir.'/'.$file_upload); // il nous reste maintenant à générer la miniature //on regarde si les dimensions sont pas inférieures a 150 pixels if (($tableau[0] < $ratio) && ($tableau[1] < $ratio)) { //si c'est le cas, ben on copie aussi le fichier dans minis copy ($_FILES['image']['tmp_name'], $dir_mini.'/'.$file_upload); } else { if(($tableau[0] < $ratio) && ($tableau[1] > $ratio)) { //si l'une des dimensions est inferieure au ratio if ($tableau[2] == 2) // si notre image est de type jpeg { $src = imagecreatefromjpeg($dir.'/'.$file_upload); $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); imagepng ($im, $dir_mini.'/'.$file_upload); } } elseif(($tableau[0] > $ratio) && ($tableau[1] < $ratio)) { if ($tableau[2] == 2) // si notre image est de type jpeg { $src = imagecreatefromjpeg($dir.'/'.$file_upload); $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); imagepng ($im, $dir_mini.'/'.$file_upload); } } else { if ($tableau[2] == 2) { // on crée une image à partir de notre grande image à l'aide de la librairie GD $src = imagecreatefromjpeg($dir.'/'.$file_upload); // on teste si notre image est de type paysage ou portrait if ($tableau[0] > $tableau[1]) { $im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]); } else { $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]); } // on copie notre fichier généré dans le répertoire des miniatures imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); if ($tableau[0] > $tableau[1]) { $im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]); } else { $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]); } imagepng ($im, $dir_mini.'/'.$file_upload); } } } // on redirige l'administrateur vers l'accueil de la partie admin //header('location: index.php'); //Génération du BBCode echo "<img src=\"url de votre logo\" width=\"781\" height=\"67\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[url=".$chemin.$dir."/".$file_upload."][img]".$chemin.$dir_mini."/".$file_upload."[/img][/url]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout sélectionner\"><br><br>Après avoir tout sélectionné, n'oubliez pas de copier ! Puis collez le dans la fenêtre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fenêtre\" onclick=\"window.close()\" />"; exit(); } else { // si notre image n'est pas de type jpeg ou png, on supprime le fichier uploadé et on affiche un petit message d'erreur unlink($_FILES['image']['tmp_name']); $erreur = 'Votre image est d\'un format non supporté.'; } } } } ?> <form method="post" enctype="multipart/form-data" target="_self"> <img style="width: 781px; height: 67px;" alt="logo" src="url de votre logo"><br> <br>Bienvenue sur l'applet d'upload d'image de votre site !<br> <br>Choisissez votre image (Attention, format jpeg ou png)<br> <br>Envoyez puis faites un copier / coller de l'INTEGRALITE du code qui vous est fourni <br> (penser au clic droit, "sélectionner tout")<br> <br> <br> <table width="100%"> <tbody> <tr> <input name="ok" value="1" type="hidden"> Sélectionnez ici votre image !<br><br> <input name="image" type="file"> <input name="go" value="Envoyer" type="submit"> </tr> </tbody> </table> </form> <? if (isset($erreur)) { echo "<b><font color=\"red\">!!!!! ".$erreur." !!!!</b><br>"; } ?>
Maintenant la variante pour wiki. Elle se met en place exactement de la même manière.
<?php //Création de la fonction str_split si PHP < 5 if (!function_exists("str_split")) { function str_split($str,$length = 1) { if ($length < 1) return false; $strlen = strlen($str); $ret = array(); for ($i = 0; $i < $strlen; $i += $length) { $ret[] = substr($str,$i,$length); } return $ret; } } //Récupération du chemin actuel $pos=strrpos($_SERVER['REQUEST_URI'],"/"); $chemin="http://".$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,$pos)."/"; // on défini le répertoire où sont stockées les images de grande taille $dir = 'pics'; // on défini le répertoire où seront stockées les miniatures $dir_mini = 'minis'; // on défini une variable $ratio qui vaudra 150 dans notre cas (150 pixels). En fait, pour nos miniatures, nous allons respecter le ratio de l'image originale, mais nous allons forcer sa taille à 150 pixels, soit en hauteur soit en largeur (tout dépend de l'orientation de notre image : paysage ou portrait). $ratio = 150; $liste = "abcdefghijklmnopqrstuvwxyz0123456789"; $liste=str_split($liste); // on teste si le formulaire permettant d'uploader un fichier a été soumis if (isset($_POST['ok'])==1) { // on teste si le champ permettant de soumettre un fichier est vide ou non if (empty($_FILES['image']['tmp_name'])) { // si oui, on affiche un petit message d'erreur $erreur = 'Aucun fichier envoyé.'; } elseif (isset($_POST['position'])==0) { $erreur = 'Aucune position spécifiée'; } else { $NomImage = ""; while(strlen($NomImage) != 8) { $NomImage .= $liste[rand(0,35)]; } $file_upload=$NomImage; // on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier (je vous suggère de regarder la documentation de la fonction getimagesize pour de plus amples informations) $tableau = @getimagesize($_FILES['image']['tmp_name']); if ($tableau == FALSE) { // si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur unlink($_FILES['image']['tmp_name']); $erreur = 'Votre fichier n\'est pas une image.'; } else { $extension_fichier = array_pop(explode(".", $_FILES['image']['name'])); $file_upload.=".".$extension_fichier; // on teste le type de notre image : jpeg ou png if ($tableau[2] == 2 || $tableau[2] == 3) { // si on a déjà un fichier qui porte le même nom que le fichier que l'on tente d'uploader, on modifie le nom du fichier que l'on upload if (is_file('pics/'.$file_upload)) $file_upload = '_'.$file_upload; // on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille copy ($_FILES['image']['tmp_name'], $dir.'/'.$file_upload); // il nous reste maintenant à générer la miniature //on regarde si les dimensions sont pas inférieures a 150 pixels if (($tableau[0] < $ratio) && ($tableau[1] < $ratio)) { //si c'est le cas, ben on copie aussi le fichier dans minis copy ($_FILES['image']['tmp_name'], $dir_mini.'/'.$file_upload); } else { if(($tableau[0] < $ratio) && ($tableau[1] > $ratio)) { //si l'une des dimensions est inferieure au ratio if ($tableau[2] == 2) // si notre image est de type jpeg { $src = imagecreatefromjpeg($dir.'/'.$file_upload); $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); imagepng ($im, $dir_mini.'/'.$file_upload); } } elseif(($tableau[0] > $ratio) && ($tableau[1] < $ratio)) { if ($tableau[2] == 2) // si notre image est de type jpeg { $src = imagecreatefromjpeg($dir.'/'.$file_upload); $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); imagepng ($im, $dir_mini.'/'.$file_upload); } } else { if ($tableau[2] == 2) { // on crée une image à partir de notre grande image à l'aide de la librairie GD $src = imagecreatefromjpeg($dir.'/'.$file_upload); // on teste si notre image est de type paysage ou portrait if ($tableau[0] > $tableau[1]) { $im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]); } else { $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]); } // on copie notre fichier généré dans le répertoire des miniatures imagejpeg ($im, $dir_mini.'/'.$file_upload); } elseif ($tableau[2] == 3) { $src = imagecreatefrompng($dir.'/'.$file_upload); if ($tableau[0] > $tableau[1]) { $im = imagecreatetruecolor($ratio,round(($ratio*$tableau[1])/$tableau[0])); imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round(($ratio/$tableau[0])*$tableau[1]), $tableau[0], $tableau[1]); } else { $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]),$ratio); imagecopyresampled($im, $src, 0, 0, 0, 0, round($tableau[0]*($ratio/$tableau[1])), $ratio, $tableau[0], $tableau[1]); } imagepng ($im, $dir_mini.'/'.$file_upload); } } } // on redirige l'administrateur vers l'accueil de la partie admin //header('location: index.php'); //Génération du BBCode if (($_POST['position'])=='gauche') { echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{".$chemin.$dir_mini."/".$file_upload."}}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout sélectionner\"><br><br>Après avoir tout sélectionné, n'oubliez pas de copier ! Puis collez le dans la fenêtre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fenêtre\" onclick=\"window.close()\" />"; exit(); } elseif (($_POST['position'])=='centre') { echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{ ".$chemin.$dir_mini."/".$file_upload." }}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout sélectionner\"><br><br>Après avoir tout sélectionné, n'oubliez pas de copier ! Puis collez le dans la fenêtre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fenêtre\" onclick=\"window.close()\" />"; exit(); } elseif (($_POST['position'])=='droite') { echo "<img src=\"url de votre logo\" width=\"X\" height=\"Y\"><br><br><form name=\"up\"><input type=\"textarea\" name=\"txt2paste\" value=\"[[".$chemin.$dir."/".$file_upload."|{{ ".$chemin.$dir_mini."/".$file_upload."}}]]\" readlony size=\"100\"></form><input type=\"button\" onclick=\"javascript:document.up.txt2paste.select();\" style=\"font-family: Arial,Verdana,Helvetica;font-size: 11px; color:#330033 ;font-weight:bold;\" value=\"Tout sélectionner\"><br><br>Après avoir tout sélectionné, n'oubliez pas de copier ! Puis collez le dans la fenêtre de postage</font></p><br><br><br><br><br><br><input type=\"button\" value=\"Fermer la fenêtre\" onclick=\"window.close()\" />"; exit(); } } else { // si notre image n'est pas de type jpeg ou png, on supprime le fichier uploadé et on affiche un petit message d'erreur unlink($_FILES['image']['tmp_name']); $erreur = 'Votre image est d\'un format non supporté.'; } } } } ?> <form method="post" enctype="multipart/form-data" target="_self"> <img style="width: Xpx; height: Ypx;" alt="logo" src="url de votre logo"><br> <br>Bienvenue sur l'applet d'upload d'image de nom du site!<br> <br>Choisissez votre image (Attention, format jpeg ou png)<br> <br>Choisissez la position de votre image dans l'article (gauche, centré ou droite)</b> <br>Envoyez puis faites un copier / coller de l'INTEGRALITE du code qui vous est fourni <br> (penser au clic droit, "sélectionner tout")<br> <br> <br> <table width="100%"> <tbody> <tr> <input name="ok" value="1" type="hidden"> Sélectionnez ici votre image !<br><br> <input name="image" type="file"> <br> <br>Choisissez la position de votre image !<br> <input name="position" type="radio" value="gauche"> A gauche<br> <input name="position" type="radio" value="centre"> Centré<br> <input name="position" type="radio" value="droite"> A droite<br><br> <input name="go" value="Envoyer" type="submit"> </tr> </tbody> </table> </form> <? if (isset($erreur)) { echo "<b><font color=\"red\">!!!!! ".$erreur." !!!!</b><br>"; } ?>
Et voila !
A bientot !
Sylvain
Commentaires
1. Le vendredi 25 mai 2007 à 22:22, par Get
Ajouter un commentaire