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

	// traiter la reponse de l'utilisateur
	if (preg_match('@^IMG/zip/[^. ]+\.zip$@i', $_POST['source_zip'])) {
		$_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_OPT_REMOVE_ALL_PATH);
				// 2. on supprime le fichier temporaire
				$contenu = verifier_compactes($archive);
				@unlink($zip);

				$_FILES = array();
				foreach ($contenu as $fichier) {
					$_FILES[] = array(
						'name' => basename($fichier),
						'tmp_name' => _tmp_dir.$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));
}

?>