Blame | 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. *
\***************************************************************************/
// 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);
/**
OBSOLETE
// 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)
);
}
// Cas d'un document distant reference sur internet
else if (preg_match(',^https?://....+,i', $_POST['image_url'])) {
$_FILES = array(
array('name' => basename($_POST['image_url']),
'tmp_name' => $_POST['image_url'])
);
$mode = 'distant';
}
//
// Upload d'un ZIP
//
if (function_exists('gzopen') AND !($mode == 'distant')) {
// 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 $id_document)");
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' => image en mode image
# ou vignette personnalisee liee a un document
# 'document' => doc ou image en mode document
# 'distant' => lien internet
$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));
}
?>