Rev 4 | Go to most recent revision | 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 fois
if (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 faire
if ($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) {
// Securite
if (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 meurt
function 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'erreur
case 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_documents
WHERE 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_extractfunction
function 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;
else
spip_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 filesystems
function 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 souci
if (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 rien
if ($t = spip_fetch_array(spip_query("SELECT * FROM spip_documents
WHERE fichier='".addslashes($source)."' AND distant='oui'")))
list($extension) = spip_fetch_array(spip_query("SELECT extension
FROM 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 telecharger
function 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_documents
WHERE 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 autorise
spip_log("mime-type $mime_type inconnu");
$t = spip_fetch_array(spip_query(
"SELECT id_type,extension FROM spip_types_documents
WHERE 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 GET
if (!$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 == 0
AND $taille < 1024*1024
AND 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 .zip
if (!$row = spip_fetch_array(spip_query(
"SELECT * FROM spip_types_documents
WHERE 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_documents
WHERE 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_documents
WHERE 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 fichier
if (!@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 lue
if ($mode == 'vignette' AND !($largeur * $hauteur)) {
@unlink($fichier);
return;
}
}
// regler l'ancre du retour
if (!$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_documents
SET 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_lien
AND 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 document
if (!$mode)
if ($type_image AND $type_inclus_image)
$mode = 'vignette';
else
$mode = 'document';
$update = "mode='$mode', ";
}
// Mise a jour des donnees
spip_query("UPDATE spip_documents
SET $update
taille='$taille', largeur='$largeur', hauteur='$hauteur',
fichier='$fichier'
WHERE id_document=$id_document");
if ($id_document_lie) {
spip_query ("UPDATE spip_documents
SET id_vignette=$id_document
WHERE 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 images
if (ereg(",$ext,", ','.lire_meta('formats_graphiques').',')
AND $mode == 'document'
AND $type_image)
creer_fichier_vignette($fichier);
**/
// Pour les fichiers distants remettre l'URL de base
if ($distant == 'oui')
spip_query("UPDATE spip_documents SET fichier='".addslashes($source)."'
WHERE id_document = $id_document");
// Demander l'indexation du document
include_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.xxx
function ajout_logo($source, $dest) {
// Intercepter une erreur d'upload
if (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 > 0
AND $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_HEIGHT
AND ($size[0] > _LOGO_MAX_WIDTH
OR $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 capacites
function tester_vignette ($test_vignette) {
global $pnmscale_command;
// verifier les formats acceptes par GD
if ($test_vignette == "gd1") {
// Si GD est installe et php >= 4.0.2
if (function_exists('imagetypes')) {
if (imagetypes() & IMG_GIF) {
$gd_formats[] = "gif";
} else {
# Attention GD sait lire le gif mais pas forcement l'ecrire
if (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 netpbm
else 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 tests
if (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
}
// Creation
function 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 base
function 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_documents
else 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_documents
WHERE 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_documents
SET id_vignette=$id_vignette WHERE id_document=$id_document");
spip_query("UPDATE spip_documents SET
id_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, fichier
FROM spip_documents
WHERE id_document=$doc_supp");
if ($row = spip_fetch_array($result)) {
$fichier = $row['fichier'];
$id_vignette = $row['id_vignette'];
spip_query("DELETE FROM spip_documents
WHERE id_document=$doc_supp");
spip_query("UPDATE spip_documents SET id_vignette=0
WHERE id_vignette=$doc_supp");
spip_query("DELETE FROM spip_documents_articles
WHERE id_document=$doc_supp");
spip_query("DELETE FROM spip_documents_rubriques
WHERE id_document=$doc_supp");
spip_query("DELETE FROM spip_documents_breves
WHERE id_document=$doc_supp");
@unlink($fichier);
if ($id_vignette > 0) {
$query = "SELECT id_vignette, fichier FROM spip_documents
WHERE id_document=$id_vignette";
$result = spip_query($query);
if ($row = spip_fetch_array($result)) {
$fichier = $row['fichier'];
@unlink($fichier);
}
spip_query("DELETE FROM spip_documents
WHERE id_document=$id_vignette");
spip_query("DELETE FROM spip_documents_articles
WHERE id_document=$id_vignette");
spip_query("DELETE FROM spip_documents_rubriques
WHERE id_document=$id_vignette");
spip_query("DELETE FROM spip_documents_breves
WHERE 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'image
if ($var_rot == 180) { // 180 = 90+90
gdRotate ($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 MANUELLE
if ($id_vignette > 0) {
creer_fichier_vignette($image);
}
*/
spip_query("UPDATE spip_documents SET largeur=$largeur, hauteur=$hauteur WHERE id_document=$doc_rotate");
}
}
?>