4 |
david |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
/***************************************************************************\
|
|
|
4 |
* SPIP, Systeme de publication pour l'internet *
|
|
|
5 |
* *
|
|
|
6 |
* Copyright (c) 2001-2005 *
|
|
|
7 |
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
|
|
|
8 |
* *
|
|
|
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 |
\***************************************************************************/
|
|
|
12 |
|
|
|
13 |
|
|
|
14 |
// Uploader un document, une image ou un logo,
|
|
|
15 |
// supprimer cet element, creer les vignettes, etc.
|
|
|
16 |
|
|
|
17 |
include ("ecrire/inc_version.php3");
|
|
|
18 |
include_ecrire('inc_presentation.php3'); # regler la langue en cas d'erreur
|
|
|
19 |
include_ecrire('inc_getdocument.php3'); # diverses fonctions de ce fichier
|
|
|
20 |
include_ecrire("inc_charsets.php3"); # pour le nom de fichier
|
|
|
21 |
include_ecrire("inc_meta.php3"); # ne pas faire confiance au cache
|
|
|
22 |
# (alea_ephemere a peut-etre change)
|
|
|
23 |
include_ecrire("inc_admin.php3"); # verifier_action_auteur
|
|
|
24 |
include_ecrire("inc_abstract_sql.php3"); # spip_insert
|
|
|
25 |
include_ecrire('inc_documents.php3'); # fichiers_upload()
|
|
|
26 |
|
|
|
27 |
|
|
|
28 |
// Recuperer les variables d'upload
|
|
|
29 |
if (!$_FILES)
|
|
|
30 |
$_FILES = &$HTTP_POST_FILES;
|
|
|
31 |
if (!is_array($_FILES))
|
|
|
32 |
$_FILES = array();
|
|
|
33 |
foreach ($_FILES as $id => $file) {
|
|
|
34 |
if ($file['error'] == 4 /* UPLOAD_ERR_NO_FILE */)
|
|
|
35 |
unset ($_FILES[$id]);
|
|
|
36 |
}
|
|
|
37 |
|
|
|
38 |
// Si on est en mode 'document', les images doivent etre installees
|
|
|
39 |
// comme documents dans le portfolio
|
|
|
40 |
if ($forcer_document) $mode = 'document';
|
|
|
41 |
|
|
|
42 |
|
|
|
43 |
//
|
|
|
44 |
// Le switch principal : quelle est l'action demandee
|
|
|
45 |
//
|
|
|
46 |
|
|
|
47 |
|
|
|
48 |
// appel de config-fonction
|
|
|
49 |
if ($test_vignette)
|
|
|
50 |
$retour_image = tester_vignette($test_vignette);
|
|
|
51 |
|
|
|
52 |
/**
|
|
|
53 |
OBSOLETE
|
|
|
54 |
|
|
|
55 |
// Creation de vignette depuis le portfolio (ou autre)
|
|
|
56 |
else if ($vignette) {
|
|
|
57 |
if ($creer_vignette == 'oui' AND
|
|
|
58 |
verifier_action_auteur("vign $vignette",
|
|
|
59 |
$hash, $hash_id_auteur))
|
|
|
60 |
creer_fichier_vignette($vignette);
|
|
|
61 |
else
|
|
|
62 |
$retour_image = creer_fichier_vignette($vignette, true); # obsolete
|
|
|
63 |
}
|
|
|
64 |
|
|
|
65 |
**/
|
|
|
66 |
|
|
|
67 |
|
|
|
68 |
//
|
|
|
69 |
// Ajout d'un document ou d'une image
|
|
|
70 |
//
|
|
|
71 |
else if ($ajout_doc == 'oui') {
|
|
|
72 |
|
|
|
73 |
// Autorisation ?
|
|
|
74 |
if (!verifier_action_auteur("ajout_doc", $hash, $hash_id_auteur))
|
|
|
75 |
die ('Interdit');
|
|
|
76 |
|
|
|
77 |
//
|
|
|
78 |
// Cas d'un fichier ou d'un repertoire installe dans ecrire/upload/
|
|
|
79 |
//
|
|
|
80 |
if ($_POST['image2']
|
|
|
81 |
AND !strstr($_POST['image2'], '..')
|
|
|
82 |
AND $_POST['ok_ftp']
|
|
|
83 |
) {
|
|
|
84 |
$upload = _DIR_TRANSFERT.$_POST['image2'];
|
|
|
85 |
|
|
|
86 |
// lire le repertoire upload et remplir $_FILES
|
|
|
87 |
if (is_dir($upload)) {
|
|
|
88 |
$fichiers = fichiers_upload($upload);
|
|
|
89 |
|
|
|
90 |
$_FILES = array();
|
|
|
91 |
foreach ($fichiers as $fichier) {
|
|
|
92 |
$_FILES[] = array (
|
|
|
93 |
'name' => basename($fichier),
|
|
|
94 |
'tmp_name' => $fichier
|
|
|
95 |
);
|
|
|
96 |
}
|
|
|
97 |
}
|
|
|
98 |
|
|
|
99 |
// seul un fichier est demande
|
|
|
100 |
else
|
|
|
101 |
$_FILES = array(
|
|
|
102 |
array ('name' => basename($upload),
|
|
|
103 |
'tmp_name' => $upload)
|
|
|
104 |
);
|
|
|
105 |
}
|
|
|
106 |
|
|
|
107 |
// Cas d'un document distant reference sur internet
|
|
|
108 |
else if (preg_match(',^https?://....+,i', $_POST['image_url'])) {
|
|
|
109 |
$_FILES = array(
|
|
|
110 |
array('name' => basename($_POST['image_url']),
|
|
|
111 |
'tmp_name' => $_POST['image_url'])
|
|
|
112 |
);
|
|
|
113 |
$mode = 'distant';
|
|
|
114 |
}
|
|
|
115 |
|
|
|
116 |
//
|
|
|
117 |
// Upload d'un ZIP
|
|
|
118 |
//
|
|
|
119 |
if (function_exists('gzopen') AND !($mode == 'distant')) {
|
|
|
120 |
|
|
|
121 |
// traiter la reponse de l'utilisateur ('telquel' ou 'decompacter')
|
|
|
122 |
if ($_POST['source_zip']
|
|
|
123 |
AND !strstr($_POST['source_zip'], '..')) # securite
|
|
|
124 |
{
|
|
|
125 |
$_FILES = array(
|
|
|
126 |
array('name' => basename($_POST['source_zip']),
|
|
|
127 |
'tmp_name' => $_POST['source_zip'])
|
|
|
128 |
);
|
|
|
129 |
}
|
|
|
130 |
|
|
|
131 |
// traiter le zip si c'en est un tout seul
|
|
|
132 |
if (count($_FILES) == 1
|
|
|
133 |
AND $action_zip!='telquel') {
|
|
|
134 |
$desc = array_pop($_FILES); # recuperer la description
|
|
|
135 |
$_FILES = array($desc);
|
|
|
136 |
|
|
|
137 |
if (preg_match('/\.zip$/i', $desc['name'])
|
|
|
138 |
OR ($desc['type'] == 'application/zip')) {
|
|
|
139 |
|
|
|
140 |
// on pose le fichier dans le repertoire zip et on met
|
|
|
141 |
// a jour $_FILES (nota : copier_document n'ecrase pas
|
|
|
142 |
// un fichier avec lui-meme : ca autorise a boucler)
|
|
|
143 |
$zip = copier_document("zip",
|
|
|
144 |
$desc['name'],
|
|
|
145 |
$desc['tmp_name']
|
|
|
146 |
);
|
|
|
147 |
if (!$zip) die ('Erreur upload zip'); # pathologique
|
|
|
148 |
$desc['tmp_name'] = $zip; # nouvel emplacement du fichier
|
|
|
149 |
$_FILES = array($desc);
|
|
|
150 |
|
|
|
151 |
// Est-ce qu'on sait le lire ?
|
|
|
152 |
require_once(_DIR_RESTREINT . 'pclzip.lib.php');
|
|
|
153 |
$archive = new PclZip($zip);
|
|
|
154 |
$contenu = verifier_compactes($archive);
|
|
|
155 |
|
|
|
156 |
// si non, on le force comme document
|
|
|
157 |
if (!$contenu) {
|
|
|
158 |
$forcer_document = 'oui';
|
|
|
159 |
}
|
|
|
160 |
|
|
|
161 |
// si le deballage est demande
|
|
|
162 |
else if ($action_zip == 'decompacter') {
|
|
|
163 |
// 1. on deballe
|
|
|
164 |
define('_tmp_dir', creer_repertoire_documents($hash));
|
|
|
165 |
$archive->extract(
|
|
|
166 |
PCLZIP_OPT_PATH, _tmp_dir,
|
|
|
167 |
PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
|
|
|
168 |
);
|
|
|
169 |
$contenu = verifier_compactes($archive);
|
|
|
170 |
// 2. on supprime le fichier temporaire
|
|
|
171 |
@unlink($zip);
|
|
|
172 |
|
|
|
173 |
$_FILES = array();
|
|
|
174 |
foreach ($contenu as $fichier) {
|
|
|
175 |
$_FILES[] = array(
|
|
|
176 |
'name' => basename($fichier),
|
|
|
177 |
'tmp_name' => _tmp_dir.basename($fichier));
|
|
|
178 |
}
|
|
|
179 |
}
|
|
|
180 |
|
|
|
181 |
// sinon on demande une reponse
|
|
|
182 |
else {
|
|
|
183 |
$link = new Link('spip_image.php3');
|
|
|
184 |
$link->addVar('ajout_doc', 'oui');
|
|
|
185 |
$link->addVar('redirect', $redirect);
|
|
|
186 |
$link->addVar('id_article', $id_article);
|
|
|
187 |
$link->addVar('mode', $mode);
|
|
|
188 |
$link->addVar('type', $type);
|
|
|
189 |
$link->addVar('hash', $hash);
|
|
|
190 |
$link->addVar('hash_id_auteur', $hash_id_auteur);
|
|
|
191 |
$link->addVar('source_zip', $zip);
|
|
|
192 |
afficher_compactes($desc, $contenu, $link);
|
|
|
193 |
exit;
|
|
|
194 |
}
|
|
|
195 |
}
|
|
|
196 |
}
|
|
|
197 |
}
|
|
|
198 |
// Fin du bloc ZIP
|
|
|
199 |
|
|
|
200 |
|
|
|
201 |
//
|
|
|
202 |
// Traiter la liste des fichiers
|
|
|
203 |
//
|
|
|
204 |
$documents_actifs = array();
|
|
|
205 |
|
|
|
206 |
foreach ($_FILES as $file) {
|
|
|
207 |
|
|
|
208 |
// afficher l'erreur 'fichier trop gros' ou autre
|
|
|
209 |
check_upload_error($file['error']);
|
|
|
210 |
|
|
|
211 |
spip_log ("ajout du document ".$file['name'].", $mode ($type $id_article $id_document)");
|
|
|
212 |
ajouter_un_document (
|
|
|
213 |
$file['tmp_name'], # le fichier sur le serveur (/var/tmp/xyz34)
|
|
|
214 |
$file['name'], # son nom chez le client (portequoi.pdf)
|
|
|
215 |
$type, # lie a un article, une breve ou une rubrique ?
|
|
|
216 |
$id_article, # identifiant de l'article (ou rubrique) lie
|
|
|
217 |
$mode, # 'vignette' => image en mode image
|
|
|
218 |
# ou vignette personnalisee liee a un document
|
|
|
219 |
# 'document' => doc ou image en mode document
|
|
|
220 |
# 'distant' => lien internet
|
|
|
221 |
$id_document, # pour une vignette, l'id_document de maman
|
|
|
222 |
$documents_actifs # tableau des id_document "actifs" (par ref)
|
|
|
223 |
);
|
|
|
224 |
} // foreach $_FILES
|
|
|
225 |
|
|
|
226 |
// Nettoyer le repertoire temporaire d'extraction des fichiers
|
|
|
227 |
if (defined('_tmp_dir'))
|
|
|
228 |
effacer_repertoire_temporaire(_tmp_dir);
|
|
|
229 |
}
|
|
|
230 |
|
|
|
231 |
// Ajout d'un logo
|
|
|
232 |
else if ($ajout_logo == "oui" and $logo) {
|
|
|
233 |
if ($desc = array_pop($_FILES)
|
|
|
234 |
AND verifier_action_auteur("ajout_logo $logo",
|
|
|
235 |
$hash, $hash_id_auteur))
|
|
|
236 |
ajout_logo($desc, $logo);
|
|
|
237 |
}
|
|
|
238 |
|
|
|
239 |
// Suppression d'un logo
|
|
|
240 |
else if ($image_supp) {
|
|
|
241 |
if (verifier_action_auteur("supp_logo $image_supp",
|
|
|
242 |
$hash, $hash_id_auteur))
|
|
|
243 |
effacer_logo($image_supp);
|
|
|
244 |
}
|
|
|
245 |
|
|
|
246 |
// Suppression d'un document et de sa vignette
|
|
|
247 |
else if ($doc_supp) {
|
|
|
248 |
if (verifier_action_auteur("supp_doc $doc_supp",
|
|
|
249 |
$hash, $hash_id_auteur))
|
|
|
250 |
supprime_document_et_vignette($doc_supp);
|
|
|
251 |
}
|
|
|
252 |
|
|
|
253 |
// Rotation d'une image
|
|
|
254 |
else if ($doc_rotate) {
|
|
|
255 |
if (verifier_action_auteur("rotate $doc_rotate",
|
|
|
256 |
$hash, $hash_id_auteur))
|
|
|
257 |
tourner_document($var_rot, $doc_rotate, $convert_command);
|
|
|
258 |
}
|
|
|
259 |
|
|
|
260 |
|
|
|
261 |
//
|
|
|
262 |
// Retour a l'envoyeur
|
|
|
263 |
//
|
|
|
264 |
|
|
|
265 |
// si nous sommes diriges vers une vignette
|
|
|
266 |
if ($retour_image) {
|
|
|
267 |
redirige_par_entete($retour_image);
|
|
|
268 |
|
|
|
269 |
} else {
|
|
|
270 |
$link = new Link(_DIR_RESTREINT_ABS . $redirect);
|
|
|
271 |
if ($documents_actifs) {
|
|
|
272 |
$show_docs = join('-',$documents_actifs);
|
|
|
273 |
$link->addVar('show_docs',$show_docs);
|
|
|
274 |
}
|
|
|
275 |
|
|
|
276 |
redirige_par_entete($link->getUrl($ancre));
|
|
|
277 |
}
|
|
|
278 |
|
|
|
279 |
?>
|