Rev 609 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/***************************************************************************\* SPIP, Systeme de publication pour l'internet ** ** Copyright (c) 2001-2005 ** Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James ** ** Ce programme est un logiciel libre distribue sous licence GNU/GPL. ** Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *\***************************************************************************///// Fonctions de spip_image.php3//// Ce fichier ne sera execute qu'une foisif (defined("_ECRIRE_INC_GETDOCUMENT")) return;define("_ECRIRE_INC_GETDOCUMENT", "1");// Creer IMG/pdf/function creer_repertoire_documents($ext) {$rep = _DIR_DOC . creer_repertoire(_DIR_DOC, $ext);if (!$ext OR !$rep) {spip_log("creer_repertoire_documents interdit");exit;}if (lire_meta("creer_htaccess") == 'oui') {include_ecrire('inc_acces.php3');verifier_htaccess($rep);}return $rep;}// Efface le repertoire de maniere recursive !function effacer_repertoire_temporaire($nom) {$d = opendir($nom);while ($f = readdir($d)) {if (is_file("$nom/$f"))@unlink("$nom/$f");else if ($f <> '.' AND $f <> '..'AND is_dir("$nom/$f"))effacer_repertoire_temporaire("$nom/$f");}@rmdir($nom);}function copier_document($ext, $orig, $source) {$dir = creer_repertoire_documents($ext);$dest = $dir .ereg_replace("[^.a-zA-Z0-9_=-]+", "_",translitteration(ereg_replace("\.([^.]+)$", "",ereg_replace("<[^>]*>", '', basename($orig)))));// Si le document "source" est deja au bon endroit, ne rien faireif ($source == ($dest . '.' . $ext))return $source;// sinon tourner jusqu'a trouver un numero correct$n = 0;while (@file_exists($newFile = $dest.($n++ ? '-'.$n : '').'.'.$ext));$newFile = preg_replace('/[.]+/', '.', $newFile);if ($r = deplacer_fichier_upload($source, $newFile))return $newFile;}//// Deplacer un fichier//function deplacer_fichier_upload($source, $dest) {// Securiteif (strstr($dest, "..")) {spip_log("stop deplacer_fichier_upload: '$dest'");exit;}$ok = @copy($source, $dest);if (!$ok) $ok = @move_uploaded_file($source, $dest);if ($ok)@chmod($dest, 0666);else {$f = @fopen($dest,'w');if ($f) {fclose ($f);} else {redirige_par_entete("spip_test_dirs.php3?test_dir=".dirname($dest));}@unlink($dest);}return $ok;}// Erreurs d'upload// renvoie false si pas d'erreur// et true si erreur = pas de fichier// pour les autres erreurs affiche le message d'erreur et meurtfunction check_upload_error($error, $msg='') {switch ($error) {case 0:return false;case 4: /* UPLOAD_ERR_NO_FILE */return true;# on peut affiner les differents messages d'erreurcase 1: /* UPLOAD_ERR_INI_SIZE */$msg = _T('upload_limit',array('max' => ini_get('upload_max_filesize')));break;case 2: /* UPLOAD_ERR_FORM_SIZE */$msg = _T('upload_limit',array('max' => ini_get('upload_max_filesize')));break;case 3: /* UPLOAD_ERR_PARTIAL */$msg = _T('upload_limit',array('max' => ini_get('upload_max_filesize')));break;}spip_log ("erreur upload $error");include_ecrire('inc_presentation.php3');install_debut_html(_T('forum_titre_erreur'));echo "<p>$msg</p>\n";install_fin_html(_DIR_RESTREINT_ABS . $GLOBALS['redirect']);exit;}//// Gestion des fichiers ZIP//function accepte_fichier_upload ($f) {if (!ereg(".*__MACOSX/", $f)AND !ereg("^\.", basename($f))) {$ext = substr(strrchr($f, "."), 1);$result = spip_query("SELECT * FROM spip_types_documentsWHERE extension='". corriger_extension(addslashes(strtolower($ext))). "' AND upload='oui'");if ($row = @spip_fetch_array($result))return true;}}# callback pour le deballage dans spip_image.php3# http://www.phpconcept.net/pclzip/man/en/?options-pclzip_cb_pre_extractfunctionfunction callback_deballe_fichier($p_event, &$p_header) {if (accepte_fichier_upload($p_header['filename'])) {$p_header['filename'] = _tmp_dir . basename($p_header['filename']);return 1;} else {return 0;}}function verifier_compactes($zip) {if ($list = $zip->listContent()) {// si pas possible de decompacter: installer comme fichier zip joint// Verifier si le contenu peut etre uploade (verif extension)$aff_fichiers = array();foreach ($list as $file) {if (accepte_fichier_upload($f = $file['stored_filename']))$aff_fichiers[]= $f;elsespip_log("chargement de $f interdit");}sort($aff_fichiers);return $aff_fichiers;}}function afficher_compactes($image_name /* not used */, $fichiers, $link) {// presenter une interface pour choisir si fichier joint ou decompacter// passer ca en squelette un de ces jours.include_ecrire ("inc_presentation.php3");install_debut_html(_T('upload_fichier_zip'));echo "<p>",_T('upload_fichier_zip_texte'),"</p>","<p>",_T('upload_fichier_zip_texte2'),"</p>",$link->getForm('POST'),"<div><input type='radio' checked name='action_zip' value='telquel'>",_T('upload_zip_telquel'),"</div>","<div><input type='radio' name='action_zip' value='decompacter'>",_T('upload_zip_decompacter'),"</div>","<ul><li>" ,join("</li>\n<li>",$fichiers) ,"</li></ul>","<div> </div>","<div style='text-align: right;'><input class='fondo' style='font-size: 9px;' type='submit' value='",_T('bouton_valider'),"'></div>","</form>";install_fin_html();}// Si on doit conserver une copie locale des fichiers distants, autant que ca// soit a un endroit canonique -- si ca peut etre bijectif c'est encore mieux,// mais la tout de suite je ne trouve pas l'idee, etant donne les limitations// des filesystemsfunction nom_fichier_copie_locale($source, $extension) {$dir = _DIR_IMG. creer_repertoire(_DIR_IMG, 'distant'); # IMG/distant/$dir2 = $dir . creer_repertoire($dir, $extension); # IMG/distant/pdf/return $dir2 . substr(basename($source).'-'.md5($source),0,12).substr(md5($source),0,4).'.'.$extension;}//// Donne le nom de la copie locale de la source//function fichier_copie_locale($source) {// Si c'est une image de IMG/ pas de souciif (preg_match(',^'._DIR_IMG.',', $source))return $source;// Si l'extension n'est pas precisee, aller la chercher dans la table// des documents -- si la source n'est pas dans la table des documents,// on ne fait rienif ($t = spip_fetch_array(spip_query("SELECT * FROM spip_documentsWHERE fichier='".addslashes($source)."' AND distant='oui'")))list($extension) = spip_fetch_array(spip_query("SELECT extensionFROM spip_types_documents WHERE id_type=".$t['id_type']));if ($extension)return nom_fichier_copie_locale($source, $extension);}// Recuperer les infos d'un document distant, sans trop le telechargerfunction recuperer_infos_distantes($source, $max=0) {include_ecrire('inc_sites.php3');$a = array();// On va directement charger le debut des images et des fichiers html,// de maniere a attrapper le maximum d'infos (titre, taille, etc). Si// ca echoue l'utilisateur devra les entrer...if ($headers = recuperer_page($source, false, true, $max)) {list($headers, $a['body']) = split("\n\n", $headers, 2);if (preg_match(",\nContent-Type: *([^[:space:];]*),i","\n$headers", $regs)AND $mime_type = addslashes(trim($regs[1]))AND $s = spip_query("SELECT id_type,extension FROM spip_types_documentsWHERE mime_type='$mime_type'")AND $t = spip_fetch_array($s)) {spip_log("mime-type $mime_type ok");$a['id_type'] = $t['id_type'];$a['extension'] = $t['extension'];} else {# par defaut on retombe sur '.bin' si c'est autorisespip_log("mime-type $mime_type inconnu");$t = spip_fetch_array(spip_query("SELECT id_type,extension FROM spip_types_documentsWHERE extension='bin'"));if (!$t) return false;$a['id_type'] = $t['id_type'];$a['extension'] = $t['extension'];}if (preg_match(",\nContent-Length: *([^[:space:]]*),i","\n$headers", $regs))$a['taille'] = intval($regs[1]);}// Echec avec HEAD, on tente avec GETif (!$a AND !$max) {spip_log("tente $source");$a = recuperer_infos_distantes($source, 1024*1024);}// S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller// recharger le document en GET et recuperer des donnees supplementaires...if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)) {if ($max == 0AND $taille < 1024*1024AND ereg(",".$a['extension'].",",','.lire_meta('formats_graphiques').',')){$a = recuperer_infos_distantes($source, 1024*1024);}else if ($a['body']) {$a['fichier'] = nom_fichier_copie_locale($source, $a['extension']);ecrire_fichier($a['fichier'], $a['body']);$size_image = @getimagesize($a['fichier']);$a['largeur'] = intval($size_image[0]);$a['hauteur'] = intval($size_image[1]);$a['type_image'] = true;}}if ($mime_type == 'text/html') {$page = recuperer_page($source, true, false, 1024*1024);if(preg_match(',<title>(.*?)</title>,ims', $page, $regs))$a['titre'] = corriger_caracteres(trim($regs[1]));if (!$a['taille']) $a['taille'] = strlen($page); # a peu pres}return $a;}//// Ajouter un document (au format $_FILES)//function ajouter_un_document ($source, $nom_envoye, $type_lien, $id_lien, $mode, $id_document, &$documents_actifs) {// Documents distants : pas trop de verifications bloquantes, mais un test// via une requete HEAD pour savoir si la ressource existe (non 404), si le// content-type est connu, et si possible recuperer la taille, voire plus.if ($mode == 'distant') {if ($a = recuperer_infos_distantes($source)) {# fichier local pour creer la vignette (!!),# on retablira la valeur de l'url a la fin$fichier = $a['fichier'];$id_type = $a['id_type'];$taille = $a['taille'];$titre = $a['titre'];$largeur = $a['largeur'];$hauteur = $a['hauteur'];$ext = $a['extension'];$type_image = $a['type_image'];$distant = 'oui';$mode = 'document';}else {spip_log("Echec du lien vers le document $source, abandon");return;}}else {$distant = 'non';// tester le type de document :// - interdit a l'upload ?// - quel numero dans spip_types_documents ? =-(// - est-ce "inclus" comme une image ?ereg("\.([^.]+)$", $nom_envoye, $match);$ext = addslashes(corriger_extension(strtolower($match[1])));// Si le fichier est de type inconnu, on va le stocker en .zipif (!$row = spip_fetch_array(spip_query("SELECT * FROM spip_types_documentsWHERE extension='$ext' AND upload='oui'"))) {/* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .BIN *//* $ext = 'bin';$nom_envoye .= '.bin';spip_log("Extension $ext");if (!$row = spip_fetch_array(spip_query("SELECT * FROM spip_types_documentsWHERE extension='bin' AND upload='oui'"))) {spip_log("Extension $ext interdite a l'upload");return;}*//* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */$ext = 'zip';spip_log("Extension $ext");if (!$row = spip_fetch_array(spip_query("SELECT * FROM spip_types_documentsWHERE extension='zip' AND upload='oui'"))) {spip_log("Extension $ext interdite a l'upload");return;}if (!$tmp_dir = tempnam(_DIR_SESSIONS, 'tmp_upload')) return;@unlink($tmp_dir); @mkdir($tmp_dir);if (!is_dir(_DIR_IMG.'tmp')) @mkdir(_DIR_IMG.'tmp');$tmp = $tmp_dir.'/'.translitteration($nom_envoye);$nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip$fichier = deplacer_fichier_upload($source, $tmp);require_once(_DIR_RESTREINT . 'pclzip.lib.php');$source = _DIR_IMG.'tmp/archive.zip';$archive = new PclZip($source);$v_list = $archive->create($tmp,PCLZIP_OPT_REMOVE_PATH, $tmp_dir,PCLZIP_OPT_ADD_PATH, '');effacer_repertoire_temporaire($tmp_dir);if (!$v_list) {spip_log("Echec creation du zip ");return;}}$id_type = $row['id_type']; # numero du type dans spip_types_documents:($type_inclus_image = ($row['inclus'] == 'image');// Recopier le fichier a son emplacement definitif$fichier = copier_document($ext, $nom_envoye, $source);if (!$fichier) {spip_log("Impossible de copier_document($ext, $nom_envoye, $source)");return;}// Quelques infos sur le fichierif (!@file_exists($fichier)OR !$taille = @filesize($fichier)) {spip_log ("Echec copie du fichier $fichier");return;}// Si c'est une image, recuperer sa taille et son type (detecte aussi swf)$size_image = @getimagesize($fichier);$largeur = intval($size_image[0]);$hauteur = intval($size_image[1]);$type_image = decoder_type_image($size_image[2]);// Si on veut uploader une vignette, il faut qu'elle ait ete bien lueif ($mode == 'vignette' AND !($largeur * $hauteur)) {@unlink($fichier);return;}}// regler l'ancre du retourif (!$GLOBALS['ancre']) {if ($mode=='vignette')$GLOBALS['ancre'] = 'images';else if ($type_image)$GLOBALS['ancre'] = 'portfolio';else$GLOBALS['ancre'] = 'documents';}// Preparation vignette du document $id_document$id_document=intval($id_document);if ($mode == 'vignette' AND $id_document_lie = $id_document) {# on force le statut "document" de ce fichier (inutile ?)spip_query("UPDATE spip_documentsSET mode='document'WHERE id_document=$id_document");$id_document = 0;}// Installer le document dans la base// attention piege semantique : les images s'installent en mode 'vignette'// note : la fonction peut "mettre a jour un document" si on lui// passe "mode=document" et "id_document=.." (pas utilise)if (!$id_document) {// Inserer le nouveau doc et recuperer son id_$id_document = spip_abstract_insert("spip_documents","(id_type, titre, date, distant)","($id_type, '".texte_script($titre)."', NOW(), '$distant')");if ($id_lienAND preg_match('/^[a-z0-9_]+$/i', $type_lien) # securite)spip_query("INSERT INTO spip_documents_".$type_lien."s(id_document, id_".$type_lien.")VALUES ($id_document, $id_lien)");// par defaut (upload ZIP ou ftp) integrer// les images en mode 'vignette' et le reste en mode documentif (!$mode)if ($type_image AND $type_inclus_image)$mode = 'vignette';else$mode = 'document';$update = "mode='$mode', ";}// Mise a jour des donneesspip_query("UPDATE spip_documentsSET $updatetaille='$taille', largeur='$largeur', hauteur='$hauteur',fichier='$fichier'WHERE id_document=$id_document");if ($id_document_lie) {spip_query ("UPDATE spip_documentsSET id_vignette=$id_documentWHERE id_document=$id_document_lie");// hack pour que le retour vers ecrire/ active le bon doc.$documents_actifs[] = $id_document_lie;}else$documents_actifs[] = $id_document;/**DESACTIVE CAR UTILISATION PAR DEFAUT DES IMAGES REDUITES// Creer la vignette des imagesif (ereg(",$ext,", ','.lire_meta('formats_graphiques').',')AND $mode == 'document'AND $type_image)creer_fichier_vignette($fichier);**/// Pour les fichiers distants remettre l'URL de baseif ($distant == 'oui')spip_query("UPDATE spip_documents SET fichier='".addslashes($source)."'WHERE id_document = $id_document");// Demander l'indexation du documentinclude_ecrire('inc_index.php3');marquer_indexer('document', $id_document);return true;}//// Convertit le type numerique retourne par getimagesize() en extension fichier//function decoder_type_image($type, $strict = false) {switch ($type) {case 1:return "gif";case 2:return "jpg";case 3:return "png";case 4:return $strict ? "" : "swf";case 5:return "psd";case 6:return "bmp";case 7:case 8:return "tif";default:return "";}}//// Corrige l'extension du fichier dans quelques cas particuliers//function corriger_extension($ext) {switch ($ext) {case 'htm':return 'html';case 'jpeg':return 'jpg';case 'tiff':return 'tif';default:return $ext;}}//// Ajouter un logo//// $source = $_FILES[0]// $dest = arton12.xxxfunction ajout_logo($source, $dest) {// Intercepter une erreur d'uploadif (check_upload_error($source['error'])) return;// analyse le type de l'image (on ne fait pas confiance au nom de// fichier envoye par le browser : pour les Macs c'est plus sur)$f =_DIR_DOC . $dest . '.tmp';deplacer_fichier_upload($source['tmp_name'], $f);$size = @getimagesize($f);$type = decoder_type_image($size[2], true);if ($type) {$poids = filesize($f);if (_LOGO_MAX_SIZE > 0AND $poids > _LOGO_MAX_SIZE*1024) {@unlink ($f);check_upload_error(6,_T('info_logo_max_poids',array('maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024),'actuel' => taille_en_octets($poids))));}if (_LOGO_MAX_WIDTH * _LOGO_MAX_HEIGHTAND ($size[0] > _LOGO_MAX_WIDTHOR $size[1] > _LOGO_MAX_HEIGHT)) {@unlink ($f);check_upload_error(6,_T('info_logo_max_taille',array('maxi' =>_T('info_largeur_vignette',array('largeur_vignette' => _LOGO_MAX_WIDTH,'hauteur_vignette' => _LOGO_MAX_HEIGHT)),'actuel' =>_T('info_largeur_vignette',array('largeur_vignette' => $size[0],'hauteur_vignette' => $size[1])))));}@rename ($f, _DIR_DOC . $dest . ".$type");}else {@unlink ($f);check_upload_error(6,_T('info_logo_format_interdit',array ('formats' => 'GIF, JPG, PNG')));}}function effacer_logo($nom) {if (!strstr($nom, ".."))@unlink(_DIR_IMG . $nom);}//// Creation automatique de vignette//// Tester nos capacitesfunction tester_vignette ($test_vignette) {global $pnmscale_command;// verifier les formats acceptes par GDif ($test_vignette == "gd1") {// Si GD est installe et php >= 4.0.2if (function_exists('imagetypes')) {if (imagetypes() & IMG_GIF) {$gd_formats[] = "gif";} else {# Attention GD sait lire le gif mais pas forcement l'ecrireif (function_exists('ImageCreateFromGIF')) {$srcImage = @ImageCreateFromGIF(_DIR_IMG . "test.gif");if ($srcImage) {$gd_formats_read_gif = ",gif";ImageDestroy( $srcImage );}}}if (imagetypes() & IMG_JPG)$gd_formats[] = "jpg";if (imagetypes() & IMG_PNG)$gd_formats[] = "png";}else { # ancienne methode de detection des formats, qui en plus# est bugguee car elle teste les formats en lecture# alors que la valeur deduite sert a identifier# les formats disponibles en ecriture... (cf. inc_logos.php3)$gd_formats = Array();if (function_exists('ImageCreateFromJPEG')) {$srcImage = @ImageCreateFromJPEG(_DIR_IMG . "test.jpg");if ($srcImage) {$gd_formats[] = "jpg";ImageDestroy( $srcImage );}}if (function_exists('ImageCreateFromGIF')) {$srcImage = @ImageCreateFromGIF(_DIR_IMG . "test.gif");if ($srcImage) {$gd_formats[] = "gif";ImageDestroy( $srcImage );}}if (function_exists('ImageCreateFromPNG')) {$srcImage = @ImageCreateFromPNG(_DIR_IMG . "test.png");if ($srcImage) {$gd_formats[] = "png";ImageDestroy( $srcImage );}}}if ($gd_formats) $gd_formats = join(",", $gd_formats);ecrire_meta("gd_formats_read", $gd_formats.$gd_formats_read_gif);ecrire_meta("gd_formats", $gd_formats);ecrire_metas();}// verifier les formats netpbmelse if ($test_vignette == "netpbm"AND $pnmscale_command) {$netpbm_formats= Array();$jpegtopnm_command = str_replace("pnmscale","jpegtopnm", $pnmscale_command);$pnmtojpeg_command = str_replace("pnmscale","pnmtojpeg", $pnmscale_command);$vignette = _DIR_IMG . "test.jpg";$dest = _DIR_IMG . "test-jpg.jpg";$commande = "$jpegtopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";spip_log($commande);exec($commande);if ($taille = @getimagesize($dest)) {if ($taille[1] == 10) $netpbm_formats[] = "jpg";}$giftopnm_command = ereg_replace("pnmscale", "giftopnm", $pnmscale_command);$pnmtojpeg_command = ereg_replace("pnmscale", "pnmtojpeg", $pnmscale_command);$vignette = _DIR_IMG . "test.gif";$dest = _DIR_IMG . "test-gif.jpg";$commande = "$giftopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";spip_log($commande);exec($commande);if ($taille = @getimagesize($dest)) {if ($taille[1] == 10) $netpbm_formats[] = "gif";}$pngtopnm_command = ereg_replace("pnmscale", "pngtopnm", $pnmscale_command);$vignette = _DIR_IMG . "test.png";$dest = _DIR_IMG . "test-gif.jpg";$commande = "$pngtopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";spip_log($commande);exec($commande);if ($taille = @getimagesize($dest)) {if ($taille[1] == 10) $netpbm_formats[] = "png";}if ($netpbm_formats)$netpbm_formats = join(",", $netpbm_formats);else$netpbm_formats = '';ecrire_meta("netpbm_formats", $netpbm_formats);ecrire_metas();}// et maintenant envoyer la vignette de testsif (ereg("^(gd1|gd2|imagick|convert|netpbm)$", $test_vignette)) {include_ecrire('inc_logos.php3');//$taille_preview = lire_meta("taille_preview");if ($taille_preview < 10) $taille_preview = 150;if ($preview = creer_vignette(_DIR_IMG . 'test_image.jpg', $taille_preview, $taille_preview, 'jpg', '', "test_$test_vignette", $test_vignette, true))return ($preview['fichier']);}return _DIR_IMG_PACK . 'puce-rouge-anim.gif'; # image echec}// Creationfunction creer_fichier_vignette($vignette, $test_cache_only=false) {if ($vignette && lire_meta("creer_preview") == 'oui') {eregi('\.([a-z0-9]+)$', $vignette, $regs);$ext = $regs[1];$taille_preview = lire_meta("taille_preview");if ($taille_preview < 10) $taille_preview = 120;include_ecrire('inc_logos.php3');if ($preview = creer_vignette($vignette, $taille_preview, $taille_preview, $ext, 'vignettes', basename($vignette).'-s', 'AUTO', false, $test_cache_only)){inserer_vignette_base($vignette, $preview['fichier']);return $preview['fichier'];}include_ecrire('inc_documents.php3');return vignette_par_defaut($ext ? $ext : 'txt', false);}}// Insertion d'une vignette dans la basefunction inserer_vignette_base($image, $vignette) {$taille = @filesize($vignette);$size = @getimagesize($vignette);$largeur = $size[0];$hauteur = $size[1];$type = $size[2];if ($type == "2") $format = 1; # spip_types_documentselse if ($type == "3") $format = 2;else if ($type == "1") $format = 3;else return;$vignette = str_replace('../', '', $vignette);spip_log("creation vignette($image) -> $vignette");if ($t = spip_query("SELECT id_document FROM spip_documentsWHERE fichier='".addslashes($image)."'")) {if ($row = spip_fetch_array($t)) {$id_document = $row['id_document'];$id_vignette = spip_abstract_insert("spip_documents","(mode)","('vignette')");spip_query("UPDATE spip_documentsSET id_vignette=$id_vignette WHERE id_document=$id_document");spip_query("UPDATE spip_documents SETid_type = '$format',largeur = '$largeur',hauteur = '$hauteur',taille = '$taille',fichier = '$vignette',date = NOW()WHERE id_document = $id_vignette");spip_log("(document=$id_document, vignette=$id_vignette)");}}}// Effacer un doc (et sa vignette)function supprime_document_et_vignette($doc_supp) {$result = spip_query("SELECT id_vignette, fichierFROM spip_documentsWHERE id_document=$doc_supp");if ($row = spip_fetch_array($result)) {$fichier = $row['fichier'];$id_vignette = $row['id_vignette'];spip_query("DELETE FROM spip_documentsWHERE id_document=$doc_supp");spip_query("UPDATE spip_documents SET id_vignette=0WHERE id_vignette=$doc_supp");spip_query("DELETE FROM spip_documents_articlesWHERE id_document=$doc_supp");spip_query("DELETE FROM spip_documents_rubriquesWHERE id_document=$doc_supp");spip_query("DELETE FROM spip_documents_brevesWHERE id_document=$doc_supp");@unlink($fichier);if ($id_vignette > 0) {$query = "SELECT id_vignette, fichier FROM spip_documentsWHERE id_document=$id_vignette";$result = spip_query($query);if ($row = spip_fetch_array($result)) {$fichier = $row['fichier'];@unlink($fichier);}spip_query("DELETE FROM spip_documentsWHERE id_document=$id_vignette");spip_query("DELETE FROM spip_documents_articlesWHERE id_document=$id_vignette");spip_query("DELETE FROM spip_documents_rubriquesWHERE id_document=$id_vignette");spip_query("DELETE FROM spip_documents_brevesWHERE id_document=$id_vignette");}}}///////////////////////////////////////////////////////////////////////// Faire tourner une image//function gdRotate ($imagePath,$rtt){if(preg_match("/\.(png|gif|jpe?g|bmp)$/i", $imagePath, $regs)) {switch($regs[1]) {case 'png':$src_img=ImageCreateFromPNG($imagePath);$save = 'imagepng';break;case 'gif':$src_img=ImageCreateFromGIF($imagePath);$save = 'imagegif';break;case 'jpeg':case 'jpg':$src_img=ImageCreateFromJPEG($imagePath);$save = 'Imagejpeg';break;case 'bmp':$src_img=ImageCreateFromWBMP($imagePath);$save = 'imagewbmp';break;default:return false;}}if (!$src_img) {spip_log("gdrotate: image non lue, $imagePath");return false;}$size=@getimagesize($imagePath);if (!($size[0] * $size[1])) return false;if (function_exists('imagerotate')) {$dst_img = imagerotate($src_img, -$rtt, 0);} else {// Creer l'image destination (hauteur x largeur) et la parcourir// pixel par pixel (un truc de fou)$process = lire_meta('image_process');if ($process == "gd2")$dst_img=ImageCreateTrueColor($size[1],$size[0]);else$dst_img=ImageCreate($size[1],$size[0]);if($rtt==90){$t=0;$b=$size[1]-1;while($t<=$b){$l=0;$r=$size[0]-1;while($l<=$r){imagecopy($dst_img,$src_img,$t,$r,$r,$b,1,1);imagecopy($dst_img,$src_img,$t,$l,$l,$b,1,1);imagecopy($dst_img,$src_img,$b,$r,$r,$t,1,1);imagecopy($dst_img,$src_img,$b,$l,$l,$t,1,1);$l++;$r--;}$t++;$b--;}}elseif($rtt==-90){$t=0;$b=$size[1]-1;while($t<=$b){$l=0;$r=$size[0]-1;while($l<=$r){imagecopy($dst_img,$src_img,$t,$l,$r,$t,1,1);imagecopy($dst_img,$src_img,$t,$r,$l,$t,1,1);imagecopy($dst_img,$src_img,$b,$l,$r,$b,1,1);imagecopy($dst_img,$src_img,$b,$r,$l,$b,1,1);$l++;$r--;}$t++;$b--;}}}ImageDestroy($src_img);ImageInterlace($dst_img,0);# obligatoire d'enregistrer dans le meme format, puisque c'est# dans le fichier de depart...$save($dst_img,$imagePath);}function tourner_document($var_rot, $doc_rotate, $convert_command) {$var_rot = intval($var_rot);$query = "SELECT id_vignette, fichier FROM spip_documents WHERE id_document=$doc_rotate";$result = spip_query($query);if ($row = spip_fetch_array($result)) {$id_vignette = $row['id_vignette'];$image = $row['fichier'];$process = lire_meta('image_process');// imagick (php4-imagemagick)if ($process == 'imagick') {$handle = imagick_readimage($image);imagick_rotate($handle, $var_rot);imagick_write($handle, $image);if (!@file_exists($image)) return; // echec imagick}else if ($process == "gd2") { // theoriquement compatible gd1, mais trop forte degradation d'imageif ($var_rot == 180) { // 180 = 90+90gdRotate ($image, 90);gdRotate ($image, 90);} else {gdRotate ($image, $var_rot);}}else if ($process = "convert") {$commande = "$convert_command -rotate $var_rot ./". escapeshellcmd($image).' ./'.escapeshellcmd($image);# spip_log($commande);exec($commande);}$size_image = @getimagesize($image);$largeur = $size_image[0];$hauteur = $size_image[1];/*A DESACTIVER PEUT-ETRE ? QUE SE PASSE--IL SI JE TOURNE UNE IMAGE AYANT UNE VGNETTE "MANUELLE" -> NE PAS CREER DE VIGNETTE TOURNEE -- EN VERITE IL NE FAUT PAS PERMETTRE DE TOURNER UNE IMAGE AYANT UNE VIGNETTE MANUELLEif ($id_vignette > 0) {creer_fichier_vignette($image);}*/spip_query("UPDATE spip_documents SET largeur=$largeur, hauteur=$hauteur WHERE id_document=$doc_rotate");}}?>