Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
?>