Skip to content
Extraits de code Groupes Projets
Bifurcation depuis spip / spip
19371 validations de retard le dépôt en amont.
spip_image.php3 7,24 Kio
<?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.   *
\***************************************************************************/


// Uploader un document, une image ou un logo,
// supprimer cet element, creer les vignettes, etc.

include ("ecrire/inc_version.php3");
include_ecrire('inc_presentation.php3');	# regler la langue en cas d'erreur
include_ecrire('inc_getdocument.php3');		# diverses fonctions de ce fichier
include_ecrire("inc_charsets.php3");		# pour le nom de fichier
include_ecrire("inc_meta.php3");			# ne pas faire confiance au cache
											# (alea_ephemere a peut-etre change)
include_ecrire("inc_admin.php3");			# verifier_action_auteur
include_ecrire("inc_abstract_sql.php3");	# spip_insert
include_ecrire('inc_documents.php3');		# fichiers_upload()


// Recuperer les variables d'upload
if (!$_FILES)
	$_FILES = &$HTTP_POST_FILES;
if (!is_array($_FILES))
	$_FILES = array();
foreach ($_FILES as $id => $file) {
	if ($file['error'] == 4 /* UPLOAD_ERR_NO_FILE */)
		unset ($_FILES[$id]);
}

// Si on est en mode 'document', les images doivent etre installees
// comme documents dans le portfolio
if ($forcer_document) $mode = 'document';


//
// Le switch principal : quelle est l'action demandee
//


// appel de config-fonction
if ($test_vignette)
	$retour_image = tester_vignette($test_vignette);

// Creation de vignette depuis le portfolio (ou autre)
else if ($vignette) {
	if ($creer_vignette == 'oui' AND
	verifier_action_auteur("vign $vignette",
	$hash, $hash_id_auteur))
		creer_fichier_vignette($vignette);
	else
		$retour_image = creer_fichier_vignette($vignette, true); # obsolete
}


//
// Ajout d'un document ou d'une image
//
else if ($ajout_doc == 'oui') {

	// Autorisation ?
	if (!verifier_action_auteur("ajout_doc", $hash, $hash_id_auteur))
		die ('Interdit');

	//
	// Cas d'un fichier ou d'un repertoire installe dans ecrire/upload/
	//
	if ($_POST['image2']
	AND !strstr($_POST['image2'], '..')
	AND $_POST['ok_ftp']
	) {
		$upload = _DIR_TRANSFERT.$_POST['image2'];

		// lire le repertoire upload et remplir $_FILES
		if (is_dir($upload)) {
			$fichiers = fichiers_upload($upload);

			$_FILES = array();
			foreach ($fichiers as $fichier) {
				$_FILES[] = array (
					'name' => basename($fichier),
					'tmp_name' => $fichier
				);
			}
		}

		// seul un fichier est demande
		else
			$_FILES = array(
				array ('name' => basename($upload),
				'tmp_name' => $upload)
			);
	}

	//
	// Upload d'un ZIP
	//
    if (function_exists('gzopen')) {

		// traiter la reponse de l'utilisateur ('telquel' ou 'decompacter')
		if ($_POST['source_zip']
		AND !strstr($_POST['source_zip'], '..')) # securite
		{
			$_FILES = array(
				array('name' => basename($_POST['source_zip']),
					'tmp_name' => $_POST['source_zip'])
			);
		}
	
		// traiter le zip si c'en est un tout seul
		if (count($_FILES) == 1
		AND $action_zip!='telquel') {
			$desc = array_pop($_FILES); # recuperer la description
			$_FILES = array($desc);
	
			if (preg_match('/\.zip$/i', $desc['name'])
			OR ($desc['type'] == 'application/zip')) {
	
				// on pose le fichier dans le repertoire zip et on met
				// a jour $_FILES (nota : copier_document n'ecrase pas
				// un fichier avec lui-meme : ca autorise a boucler)
				$zip = copier_document("zip",
					$desc['name'],
					$desc['tmp_name']
				);
				if (!$zip) die ('Erreur upload zip'); # pathologique
				$desc['tmp_name'] = $zip;	# nouvel emplacement du fichier
				$_FILES = array($desc);
	
				// Est-ce qu'on sait le lire ?
				require_once(_DIR_RESTREINT . 'pclzip.lib.php');
				$archive = new PclZip($zip);
				$contenu = verifier_compactes($archive);
	
				// si non, on le force comme document
				if (!$contenu) {
					$forcer_document = 'oui';
				}
	
				// si le deballage est demande
				else if ($action_zip == 'decompacter') {
					// 1. on deballe
					define('_tmp_dir', creer_repertoire_documents($hash));
					$archive->extract(
						PCLZIP_OPT_PATH, _tmp_dir,
						PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
						);
					$contenu = verifier_compactes($archive);
					// 2. on supprime le fichier temporaire
					@unlink($zip);
	
					$_FILES = array();
					foreach ($contenu as $fichier) {
						$_FILES[] = array(
							'name' => basename($fichier),
							'tmp_name' => _tmp_dir.basename($fichier));
					}
				}
	
				// sinon on demande une reponse
				else {
					$link = new Link('spip_image.php3');
					$link->addVar('ajout_doc', 'oui');
					$link->addVar('redirect', $redirect);
					$link->addVar('id_article', $id_article);
					$link->addVar('mode', $mode);
					$link->addVar('type', $type);
					$link->addVar('hash', $hash);
					$link->addVar('hash_id_auteur', $hash_id_auteur);
					$link->addVar('source_zip', $zip);
					afficher_compactes($desc, $contenu, $link);
					exit;
				}
			}
		}
	}
	// Fin du bloc ZIP


	//
	// Traiter la liste des fichiers
	//
	$documents_actifs = array();

	foreach ($_FILES as $file) {

		// afficher l'erreur 'fichier trop gros' ou autre
		check_upload_error($file['error']);

		spip_log ("ajout du document ".$file['name'].", $mode ($type $id_article)");
		ajouter_un_document (
			$file['tmp_name'],	# le fichier sur le serveur (/var/tmp/xyz34)
			$file['name'],		# son nom chez le client (portequoi.pdf)
			$type,				# lie a un article, une breve ou une rubrique ?
			$id_article,		# identifiant de l'article (ou rubrique) lie
			$mode,				# 'vignette' => vignette personnalisee
			$id_document,		# pour une vignette, l'id_document de maman
			$documents_actifs	# tableau des id_document "actifs" (par ref)
		);
	}	// foreach $_FILES

	// Nettoyer le repertoire temporaire d'extraction des fichiers
	if (defined('_tmp_dir'))
		effacer_repertoire_temporaire(_tmp_dir);
}

// Ajout d'un logo
else if ($ajout_logo == "oui" and $logo) {
	if ($desc = array_pop($_FILES)
	AND verifier_action_auteur("ajout_logo $logo",
	$hash, $hash_id_auteur))
		ajout_logo($desc, $logo);
}

// Suppression d'un logo
else if ($image_supp) {
	if (verifier_action_auteur("supp_logo $image_supp",
	$hash, $hash_id_auteur))
		effacer_logo($image_supp);
}

// Suppression d'un document et de sa vignette
else if ($doc_supp) {
	if (verifier_action_auteur("supp_doc $doc_supp",
	$hash, $hash_id_auteur))
		supprime_document_et_vignette($doc_supp);
}

// Rotation d'une image
else if ($doc_rotate) {
	if (verifier_action_auteur("rotate $doc_rotate",
	$hash, $hash_id_auteur))
		tourner_document($var_rot, $doc_rotate, $convert_command);
}


//
// Retour a l'envoyeur
//

// si nous sommes diriges vers une vignette
if ($retour_image) {
	redirige_par_entete($retour_image);

} else {
	$link = new Link(_DIR_RESTREINT_ABS . $redirect);
	if ($documents_actifs) {
		$show_docs = join('-',$documents_actifs);
		$link->addVar('show_docs',$show_docs);
	}

	redirige_par_entete($link->getUrl($ancre));
}

?>