Suite à une demande, j'ai fait une petite modification dans mon script pour remplacer les espaces des noms de fichiers par des underscores.
Si certains utilisaient la précédente version, voici les lignes modifiées :
20: for i in `ls -Aw1 $1` 30: IMG_FILE_LOWER=$(echo $IMG_FILE | tr '[:upper:] àçéèêëîïôöùüÂÇÉÈÊËÎ??ÔÖÙÜ' '[:lower:]_aceeeeiioouuACEEEEIIOOUU') 78: IFS=$'\t\n'
Et pour ceux qui voudraient conserver les majuscules dans les noms de fichiers, il suffit de supprimer [:upper:] et [:lower:] en ligne 30.
P.S. : ligne 30, après le caractère Î, il y a un I tréma (??) qui n'apparait pas sous IE et qui apparaît bizarement sous Firefox. Pensez à faire la correction vous-même.
J'ai adapté le code de Rych à la version 1.4 si cela intéresse quelqu'un. Je l'ai placé à la ligne 350 de la page /admin/update.php .
Conditions nécessaires :
- ImageMagick installé,
- régler le mode du dossier et des fichiers à 777 manuellement avec un client ftp ou par un cron,
- faire deux synchronisations, une qui créera les thumbnails et plein écrans, l'autre qui mettra à jour la base de données,
J'essaierai de trouver un moyen plus propre de le faire plus tard, à moins que Pierrick ne m'indique avant à quel endroit insérer le code pour n'effectuer qu'une mise à jour.
$thdir = $dirname.'/thumbnail/'; $hidir = $dirname.'/pwg_high/'; $oldumask = umask(0); @mkdir("$thdir", 0777); @mkdir("$hidir", 0777); umask($oldumask); $filenamelow = strtolower($filename); $dirfilename = $dirname.'/'.$filename; $dirfilenamelow = $dirname.'/'.$filenamelow; rename ("$dirfilename", "$dirfilenamelow"); $hidir_filenamelow = $hidir.$filenamelow; $thdir_filenamelow = $thdir.$filenamelow; rename ("$dirfilenamelow", "$hidir_filenamelow"); $converthi = "convert $hidir_filenamelow -resize 600x600 $dirfilenamelow"; $convertth = "convert $dirfilenamelow -resize 128x128 $thdir_filenamelow"; passthru( $converthi ); passthru( $convertth );
Grand-Pa a écrit:
Question idiote : le script est bien en chmod 775 (exécutable par others) ?
Les droits du script sont 755.
Grand-Pa a écrit:
Le script est-il situé dans le répertoire de PWG ?
Non, il est dans /usr/local/bin/ pour être utilisable partout en ligne de commande sans préciser le chemin. J'ai essayé de le copier dans le répertoire de PWG et de le lancer avec exec ('./maj $dirname') sans succès.
Grand-Pa a écrit:
Dans php.ini, quelle sont les valeurs associées à safe_mode et safe_mode_exec_dir ?
Le safe_mode est off :
; Safe Mode ; safe_mode = Off ; By default, Safe Mode does a UID compare check when ; opening files. If you want to relax this to a GID compare, ; then turn on safe_mode_gid. safe_mode_gid = Off ; When safe_mode is on, UID/GID checks are bypassed when ; including files from this directory and its subdirectories. ; (directory must also be in include_path or full path must ; be used when including) safe_mode_include_dir = ; When safe_mode is on, only executables located in the safe_mode_exec_dir ; will be allowed to be executed via the exec family of functions. safe_mode_exec_dir =
Grand-Pa a écrit:
A ce sujet, attention aux droits 0777, généralement inutiles : 0775 ou même 0755 convient dans la plupart des cas.
Il faut que les droits du dossier soient 777 pour qu'Apache puisse créer les dossiers pwg_high et thumbnail et exécuter convert. Le problème vient de là!
Dans admin/update.php j'ai fait plusieurs tests :
exec('/usr/local/bin/maj /var/www/html/photos/galleries/toto');
Sans les droits 777 le script n'est pas exécuté => Apache n'a pas l'autorisation de faire un chmod et chown au début de mon script shell, il faut donc que je programme un cron pour parcourir les dossiers et en changer les droits.
$pathphoto = str_replace( './', '/var/www/html/photos/', $dirname ); echo "<h1>dirname : $dirname<br>pathphoto : $pathphoto<br><br></h1>";
Résultat :
dirname : ./galleries/toto
pathphoto : /var/www/html/photos/galleries/toto
$pathphoto = str_replace( './', '/var/www/html/photos/', $dirname ); exec('/usr/local/bin/maj $pathphoto');
Résultat d'un ps afx sur le serveur :
17932 ? Ss 0:00 /usr/sbin/httpd 17935 ? S 0:00 \_ /usr/sbin/httpd 19483 ? S 0:00 | \_ /bin/bash /usr/local/bin/maj 19615 ? R 0:00 | \_ convert -resize 128x128 /random.php /thumbnail/random.php
Je ne comprends pas pourquoi convert s'attaque aux fichiers .php à la racine du site au lieu de traiter les fichiers de /var/www/html/photos/galleries/toto . Cela dépasse mon niveau de compétences!
Je crois que je vais essayer ton script!
Merci pour ton aide.
Dans ton exec(), as-tu essayé d'indiquer le chemin complet de ton script ?
Question idiote : le script est bien en chmod 775 (exécutable par others) ?
Le script est-il situé dans le répertoire de PWG ?
Dans php.ini, quelle sont les valeurs associées à safe_mode et safe_mode_exec_dir ?
Sinon, juste pour info, voici le script que j'ai écrit et que j'utilise pour mes galeries (fonctionnement récursif pour les galeries à plusieurs niveaux) :
#!/bin/bash # Répertoire de base de la galerie BASE_REP="/home/e-smith/files/ibays/galerie/galerie" # Nom des répertoires contenant les images grand format HIGH_REP="pwg_high" # Nom des répertoires contenant les vignettes TN_REP="thumbnail" # Préfixe des fichiers vignettes TN_PRE="tn-" # Dimension des vignettes TN_SZ=150 # Dimension des images à afficher IMG_SZ=800 # Qualité des images QUAL=80 mk_thumb() { for i in `ls -Aw1 $1` do # Ignorer les répertoires des images grand format et des vignettes if [ -d $1/$i -a "$i" != "$HIGH_REP" -a "$i" != "$TN_REP" ] then # Recherche des fichiers JPEG find $1/$i -type f -maxdepth 1 \( -iname *.jpg -o -iname *.jpeg \) -printf "%f\n" | while read IMG_FILE do echo -n "Traitement de $i/$IMG_FILE..." # Renommage du fichier en minuscules et modification des caractères spéciaux IMG_FILE_LOWER=$(echo $IMG_FILE | tr '[:upper:] àçéèêëîïôöùüÂÇÉÈÊËÎ??ÔÖÙÜ' '[:lower:]_aceeeeiioouuACEEEEIIOOUU') if [ $IMG_FILE != $IMG_FILE_LOWER ] then mv $1/$i/$IMG_FILE $1/$i/$IMG_FILE_LOWER && echo -n " LOWER..." IMG_FILE=$IMG_FILE_LOWER fi # Suppression de l'EXIF thumbnail pour gain de place et temps de téléchargement jhead -dt $1/$i/$IMG_FILE > /dev/null && echo -n " EXIF..." # Correction de la date dans l'EXIF pour les images post-traitées par des logiciels gorets IMG_DATE=$(jhead -v $1/$i/$IMG_FILE | grep "DateTime " | cut -b 17-35 | tr "\- T" ":-") IMG_ORIG=$(jhead -v $1/$i/$IMG_FILE | grep "DateTimeOriginal " | cut -b 29-47 | tr "\- T" ":-") if [ "$IMG_ORIG" != "" -a "$IMG_DATE" != "$IMG_ORIG" ] then jhead -ts$IMG_ORIG $1/$i/$IMG_FILE > /dev/null && echo -n " DATE..." fi # Vérification de la taille de l'image (suppérieur au format affiché ?) if [ $(identify -format "%w" $1/$i/$IMG_FILE) -gt $IMG_SZ -o $(identify -format "%h" $1/$i/$IMG_FILE) -gt $IMG_SZ ] then # Création du répertoire des images grand format [ ! -e $1/$i/$HIGH_REP ] && mkdir $1/$i/$HIGH_REP # Déplacement du fichier dans le répertoire des images grand format if [ ! -e $1/$i/$HIGH_REP/$IMG_FILE ] then mv $1/$i/$IMG_FILE $1/$i/$HIGH_REP && echo -n " HIGH..." fi # Redimensionnement de l'image à afficher convert -antialias -geometry $IMG_SZ\x$IMG_SZ\> -quality $QUAL $1/$i/$HIGH_REP/$IMG_FILE $1/$i/$IMG_FILE && echo -n " SIZE..." fi # Création du répertoire des vignettes [ ! -e $1/$i/$TN_REP ] && mkdir $1/$i/$TN_REP # Création de la vignette TN_FILE=$1/$i/$TN_REP/$TN_PRE$IMG_FILE if [ ! -e $TN_FILE ] then convert -antialias -thumbnail $TN_SZ\x$TN_SZ\> -quality $QUAL $1/$i/$IMG_FILE $TN_FILE && echo -n " THUMB..." fi echo done # On recommence avec le répertoire suivant mk_thumb "$1/$i" fi done } echo "" echo "********************************************************" echo "* Traitement des images *" echo "********************************************************" IFS=$'\t\n' mk_thumb $BASE_REP echo "" echo "********************************************************" echo "* Mise à jour des photos sur le site distant *" echo "********************************************************" /usr/bin/lftp -c "open -u FAI_USERNAME,FAI_PASSWORD ftp://ftpperso.free.fr ; mirror -R -e -vvv $BASE_REP /galerie/"
Attention : ligne 30, après le caractère Î, il y a un I tréma (??) qui n'apparait pas sous IE et qui apparaît bizarement sous Firefox. Pensez à faire la correction vous-même.
Ce script nécéssite les programmes suivants :
*) ImageMagick (traitement des images)
*) XFree86-libs (pour satisfaire les dépendances d'ImageMagick)
*) libtiff (pour satisfaire les dépendances d'ImageMagick)
*) jhead (pour le traitement des EXIF)
*) lftp (pour la mise à jour du site distant)
J'utilise un autre script (également récursif) pour mettre à jour les droits sur mon arborescence.
A ce sujet, attention aux droits 0777, généralement inutiles : 0775 ou même 0755 convient dans la plupart des cas.
Bonjour,
Je cherche un moyen pour créer les images "plein écran" 600x400 et les thumbnails d'après des photos en haute def envoyées dans un dossier. J'ai installé GD, sans résultat, puis suite à la lecture d'un post de Rych sur le forum Anglais j'ai installé ImageMagick sur mon serveur et écrit le script shell suivant qui fonctionne parfaitement quand il est exécuté en root en ligne de commande sur le serveur avec cd folder ; maj .
#!/bin/bash if [ ! -e $1/thumbnail ] then mkdir $1/thumbnail chmod -R 777 $1/thumbnail chown -R moncompte:root $1/thumbnail fi if [ ! -e $1/pwg_high ] then mkdir $1/pwg_high chmod -R 777 $1/pwg_high chown -R moncompte:root $1/pwg_high fi cd $1 for file in $(ls) do if [ -f $file ] then chmod -R 777 $file small=`echo $file | tr '[A-Z]' '[a-z]'` if [ ! -e pwg_high/$small ] then mv $file pwg_high/$small convert -resize 600x600 pwg_high/$small $small convert -resize 128x128 $small thumbnail/$small chmod -R 777 $1 chown -R moncompte:root $1 fi fi done exit
Ce script crée les dossiers pwg_high et thumbnail s'ils n'existent pas, change les droits et propriétaire, déplace les nouvelles photos dans le dossier pwg_high, crée un 600x400 dans le dossier parent et un 128x128 dans le dossier thumbnail.
J'a placé le code ci-dessous à la ligne 336 de la page admin/update.php :
$pathphoto = str_replace( './', '/var/www/html/photos/', $dirname ); exec('maj $pathphoto');
Mais rien ne se produit quand je lance la "synchronisation" dans l'administration du site.
Est-de un problème de droits, de php.ini, d'emplacement du script dans la page php?
Existe t'il un moyen plus élégant d'obtenir ce que je souhaite?
D'avance merci pour toute aide.