3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
15 include_spip('inc/charsets'); # pour le nom de fichier
16 include_spip('base/abstract_sql');
17 include_spip('inc/actions');
19 // http://doc.spip.org/@action_joindre_dist
20 function action_joindre_dist()
22 global $hash, $url, $chemin, $ancre,
28 $_FILES, $HTTP_POST_FILES;
30 $securiser_action = charger_fonction('securiser_action', 'inc');
31 $arg = $securiser_action();
33 $redirect = _request('redirect');
34 $iframe_redirect = _request('iframe_redirect');
35 if (!preg_match(',^(-?\d+)\D(\d+)\D(\w+)/(\w+)$,',$arg,$r)) {
36 spip_log("action_joindre_dist incompris: " . $arg);
37 redirige_par_entete(urldecode($redirect));
39 list($arg, $id, $id_document, $mode, $type) = $r;
41 // pas terrible, mais c'est le pb du bouton Submit qui retourne son texte,
42 // et son transcodage est couteux et perilleux
43 $sousaction = 'spip_action_joindre' .
50 $path = ($sousaction1 ?
($_FILES ?
$_FILES : $HTTP_POST_FILES) :
51 ($sousaction2 ?
$url : $chemin));
53 $documents_actifs = array();
55 if (function_exists($sousaction))
56 $type_image = $sousaction($path, $mode, $type, $id, $id_document,
57 $hash, $redirect, $documents_actifs, $iframe_redirect);
59 else spip_log("spip_action: sousaction inconnue $sousaction");
61 $redirect = urldecode($redirect);
62 if ($documents_actifs) {
63 $redirect = parametre_url($redirect,'show_docs',join(',',$documents_actifs),'&');
68 if ($mode=='vignette')
76 $redirect .= '#' . $ancre;
77 if ($type == 'rubrique') {
78 include_spip('inc/rubriques');
82 if(_request("iframe") == 'iframe') {
83 $redirect = parametre_url(urldecode($iframe_redirect),"show_docs",join(',',$documents_actifs),'&')."&iframe=iframe";
86 redirige_par_entete($redirect);
87 ## redirection a supprimer si on veut poster dans l'espace prive directement (UPLOAD_DIRECT)
91 // Cas d'un document distant reference sur internet
93 // http://doc.spip.org/@spip_action_joindre2
94 function spip_action_joindre2($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
96 return joindre_documents(array(
97 array('name' => basename($path),
99 ), 'distant', $type, $id, $id_document,
100 $hash, $redirect, $actifs, $iframe_redirect);
103 // Cas d'un fichier transmis
105 // http://doc.spip.org/@spip_action_joindre1
106 function spip_action_joindre1($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
110 foreach ($path as $file) {
111 if (!($file['error'] == 4) /* UPLOAD_ERR_NO_FILE */)
115 return joindre_documents($files, $mode, $type, $id, $id_document,
116 $hash, $redirect, $actifs, $iframe_redirect);
119 // copie de tout ou partie du repertoire upload
121 // http://doc.spip.org/@spip_action_joindre3
122 function spip_action_joindre3($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
124 if (!$path ||
strstr($path, '..')) return;
126 $upload = determine_upload();
127 if ($path != '/' AND $path != './') $upload .= $path;
129 if (!is_dir($upload))
130 // seul un fichier est demande
131 $files = array(array ('name' => basename($upload),
132 'tmp_name' => $upload)
135 include_spip('inc/documents');
137 foreach (preg_files($upload) as $fichier) {
139 'name' => basename($fichier),
140 'tmp_name' => $fichier
145 return joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, $actifs, $iframe_redirect);
149 // Charger la fonction surchargeable receptionnant un fichier
150 // et l'appliquer sur celui ou ceux indiques.
152 // http://doc.spip.org/@joindre_documents
153 function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect)
155 $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
157 if (function_exists('gzopen')
158 AND !($mode == 'distant')
159 AND (count($files) == 1)) {
162 if (preg_match('/\.zip$/i', $desc['name'])
163 OR ($desc['type'] == 'application/zip')) {
165 // on pose le fichier dans le repertoire zip
166 // (nota : copier_document n'ecrase pas un fichier avec lui-meme
167 // ca autorise a boucler)
168 $zip = copier_document("zip",
173 {include_spip('minipres'); echo minipres('Erreur upload zip'); exit;} # pathologique
174 // Est-ce qu'on sait le lire ?
175 include_spip('inc/pclzip');
176 $archive = new PclZip($zip);
178 $valables = verifier_compactes($archive);
180 echo liste_archive_jointe($valables, $mode, $type, $id, $id_document, $hash, $redirect, $zip, $iframe_redirect);
181 // a tout de suite en joindre4, joindre5, ou joindre6
187 foreach ($files as $arg) {
188 check_upload_error($arg['error']);
189 $x = $ajouter_documents($arg['tmp_name'], $arg['name'],
190 $type, $id, $mode, $id_document, $actifs);
192 // un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique
193 include_spip('inc/invalideur');
194 suivre_invalideur("id='id_$type/$id'");
198 #-----------------------------------------------------------------------
200 // sous-actions suite a l'envoi d'un Zip:
201 // la fonction joindre_documents ci-dessus a construit un formulaire
202 // qui renvoie sur une des 3 sous-actions qui suivent.
204 // Zip avec confirmation "tel quel"
206 // http://doc.spip.org/@spip_action_joindre5
207 function spip_action_joindre5($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
209 $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
210 $pos = strpos($path, '/zip/');
212 $pos = strpos($path, '/zip_');
214 return $ajouter_documents($path, substr($path, $pos+
5), $type, $id, $mode, $id_document, $actifs);
219 // http://doc.spip.org/@spip_action_joindre6
220 function spip_action_joindre6($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
222 $x = joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
223 // suppression de l'archive en zip
228 // Zip avec les 2 options a la fois
230 // http://doc.spip.org/@spip_action_joindre4
231 function spip_action_joindre4($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
233 joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
234 return spip_action_joindre5($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
237 // http://doc.spip.org/@joindre_deballes
238 function joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
240 $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
241 define('_tmp_dir', creer_repertoire_documents($hash));
243 if (_tmp_dir
== _DIR_DOC
)
244 {include_spip('minipres');
245 echo minipres(_T('avis_operation_impossible'));
248 include_spip('inc/pclzip');
249 $archive = new PclZip($path);
251 PCLZIP_OPT_PATH
, _tmp_dir
,
252 PCLZIP_CB_PRE_EXTRACT
, 'callback_deballe_fichier'
254 $contenu = verifier_compactes($archive);
256 foreach ($contenu as $fichier) {
257 $f = basename($fichier);
258 $x = $ajouter_documents(_tmp_dir
. $f, $f,
259 $type, $id, $mode, $id_document, $actifs);
261 effacer_repertoire_temporaire(_tmp_dir
);