source: spip-zone/_plugins_/gestion_documents/inc/joindre_document.php @ 38403

Last change on this file since 38403 was 38403, checked in by cedric@…, 11 years ago

au deballage d'un zip, il est possible d'indiquer que les images doivent toutes aller dans le portfolio

File size: 8.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2009                                                *
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
13if (!defined("_ECRIRE_INC_VERSION")) return;
14include_spip('inc/ajouter_documents'); // compat core
15
16
17/**
18 * Recuperer le nom du fichier selon le mode d'upload choisi
19 * et mettre cela au format $_FILES
20 *
21 * Renvoie une liste de fichier ou un message en cas d'erreur
22 *
23 * @return string/array
24 */
25function joindre_trouver_fichier_envoye(){
26        static $files = array();
27        // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
28        // lorsqu'on est appelle au traitement
29       
30        if (count($files))
31                return $files;
32       
33        if (_request('joindre_upload')){
34                $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
35                $files = array();
36                if (is_array($post)){
37                        include_spip('action/ajouter_documents');
38                  foreach ($post as $file) {
39                        if (is_array($file['name'])){
40                                while (count($file['name'])){
41                                                $test=array(
42                                                        'error'=>array_shift($file['error']),
43                                                        'name'=>array_shift($file['name']),
44                                                        'tmp_name'=>array_shift($file['tmp_name']),
45                                                        'type'=>array_shift($file['type']),
46                                                        );
47                                                if (!($test['error'] == 4)){
48                                                        if (is_string($err = joindre_upload_error($test['error'])))
49                                                                return $err; // un erreur upload
50                                                        if (!verifier_upload_autorise($test['name']))
51                                                                return _T('gestdoc:erreur_upload_type_interdit',array('nom'=>$test['name']));
52                                                        $files[]=$test;
53                                                }
54                                }
55                        }
56                        else {
57                                //UPLOAD_ERR_NO_FILE
58                                        if (!($file['error'] == 4)){
59                                                if (is_string($err = joindre_upload_error($file['error'])))
60                                                        return $err; // un erreur upload
61                                                if (!verifier_upload_autorise($file['name']))
62                                                        return _T('gestdoc:erreur_upload_type_interdit',array('nom'=>$file['name']));
63                                                $files[]=$file;
64                                        }
65                        }
66                        }
67                        if (!count($files))
68                                return _T('gestdoc:erreur_indiquez_un_fichier');
69                }
70                return $files;
71        }
72        elseif (_request('joindre_distant')){
73                $path = _request('url');
74                if (!strlen($path) OR $path=='http://')
75                        return _T('gestdoc:erreur_indiquez_un_fichier');
76                include_spip('action/ajouter_documents');
77                $infos = renseigner_source_distante($path);
78                if (!is_array($infos))
79                        return $infos; // message d'erreur
80                else
81                        return array(
82                                array(
83                                        'name' => basename($path),
84                                        'tmp_name' => $path,
85                                        'distant' => true,
86                                )
87                        );
88        }
89        elseif (_request('joindre_ftp')){
90                $path = _request('cheminftp');
91                if (!$path || strstr($path, '..')) return _T('gestdoc:erreur_indiquez_un_fichier');
92               
93                include_spip('inc/actions');
94                $upload = determine_upload();
95                if ($path != '/' AND $path != './') $upload .= $path;
96       
97                if (!is_dir($upload))
98                  // seul un fichier est demande
99                  return array(
100                        array (
101                                'name' => basename($upload),
102                                        'tmp_name' => $upload
103                                )
104                        );
105                else {
106                  // on upload tout un repertoire
107                  $files = array();
108                  foreach (preg_files($upload) as $fichier) {
109                                $files[]= array (
110                                        'name' => basename($fichier),
111                                        'tmp_name' => $fichier
112                                );
113                  }
114                  return $files;
115                }
116        }
117        elseif (_request('joindre_zip') AND $path = _request('chemin_zip')){
118                define('_tmp_dir', creer_repertoire_documents(md5($path.$GLOBALS['visiteur_session']['id_auteur'])));
119                if (_tmp_dir == _DIR_IMG)
120                        return _T('avis_operation_impossible');
121               
122                $files = array();
123                if (_request('options_upload_zip')=='deballe')
124                        $files = joindre_deballer_lister_zip($path,_tmp_dir);
125         
126                // si le zip doit aussi etre conserve, l'ajouter
127                if (_request('options_upload_zip')=='upload' OR _request('options_deballe_zip_conserver')){
128                $files[] = array(
129                                'name' => basename($path),
130                                'tmp_name' => $path,
131                );
132          }
133
134          return $files;
135               
136        }
137
138        return array();
139}
140
141
142// Erreurs d'upload
143// renvoie false si pas d'erreur
144// et true si erreur = pas de fichier
145// pour les autres erreurs renvoie le message d'erreur
146function joindre_upload_error($error) {
147
148        if (!$error) return false;
149        spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php");
150        switch ($error) {
151                       
152                case 4: /* UPLOAD_ERR_NO_FILE */
153                        return true;
154
155                # on peut affiner les differents messages d'erreur
156                case 1: /* UPLOAD_ERR_INI_SIZE */
157                        $msg = _T('upload_limit',
158                        array('max' => ini_get('upload_max_filesize')));
159                        break;
160                case 2: /* UPLOAD_ERR_FORM_SIZE */
161                        $msg = _T('upload_limit',
162                        array('max' => ini_get('upload_max_filesize')));
163                        break;
164                case 3: /* UPLOAD_ERR_PARTIAL  */
165                        $msg = _T('upload_limit',
166                        array('max' => ini_get('upload_max_filesize')));
167                        break;
168               
169                default: /* autre */
170                        if (!$msg)
171                        $msg = _T('pass_erreur').' '. $error
172                        . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]");
173                        break;
174        }
175
176        spip_log ("erreur upload $error");
177        return $msg;
178       
179}
180
181/**
182 * Verifier si le fichier poste est un zip
183 * Si on sait le deballer, proposer les options necessaires
184 *
185 * @param array $files
186 * @return string
187 */
188function joindre_verifier_zip($files){
189        if (function_exists('gzopen')
190         AND (count($files) == 1)
191         AND !isset($files[0]['distant'])
192         AND 
193          (preg_match('/\.zip$/i', $files[0]['name']) 
194           OR ($files[0]['type'] == 'application/zip'))
195          ){
196       
197          // on pose le fichier dans le repertoire zip
198          // (nota : copier_document n'ecrase pas un fichier avec lui-meme
199          // ca autorise a boucler)
200          include_spip('inc/getdocument');
201                $desc = $files[0];
202                $zip = copier_document("zip",
203                                        $desc['name'],
204                                        $desc['tmp_name']
205                                );
206               
207                // Est-ce qu'on sait le lire ?
208                include_spip('inc/pclzip');
209                if ($zip
210                 AND $archive = new PclZip($zip)
211                 AND $contenu = joindre_decrire_contenu_zip($archive)
212                 AND rename($zip, $tmp = _DIR_TMP.basename($zip))
213                 ){
214                        $contenu[] = $tmp;
215                        return $contenu;
216                 }
217        }
218       
219        // ce n'est pas un zip sur lequel il faut demander plus de precisions
220        return false;
221}
222
223/**
224 * Verifier et decrire les fichiers de l'archive, en deux listes :
225 * - une liste des noms de fichiers ajoutables
226 * - une liste des erreurs (fichiers refuses)
227 *
228 * @param object $zip
229 * @return array
230 */
231function joindre_decrire_contenu_zip($zip) {
232        include_spip('action/ajouter_documents');
233        if (!$list = $zip->listContent()) return false;
234
235        // si pas possible de decompacter: installer comme fichier zip joint
236        // Verifier si le contenu peut etre uploade (verif extension)
237        $fichiers = array();
238        $erreurs = array();
239        foreach ($list as $file) {
240                if (accepte_fichier_upload($f = $file['stored_filename']))
241                        $fichiers[$f] = $file;
242                else
243                        // pas de message pour les dossiers et fichiers caches
244                        if (substr($f,-1)!=='/' AND substr(basename($f),0,1)!=='.')
245                                $erreurs[] = _T('gestdoc:erreur_upload_type_interdit',array('nom'=>$f));
246        }
247        ksort($fichiers);
248        return array($fichiers,$erreurs);
249}
250
251
252
253// http://doc.spip.org/@joindre_deballes
254function joindre_deballer_lister_zip($path,$tmp_dir) {
255  include_spip('inc/pclzip');
256        $archive = new PclZip($path);
257        $archive->extract(
258                PCLZIP_OPT_PATH, _tmp_dir,
259                PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
260        );
261        if ($contenu = joindre_decrire_contenu_zip($archive)){
262                $files = array();
263                $fichiers = reset($contenu);           
264                foreach($fichiers as $fichier){
265                        $f = basename($fichier['filename']);
266                        $files[] = array('tmp_name'=>$tmp_dir. $f,'name'=>$f,'titrer'=>_request('options_deballe_zip_titrer'),'mode'=>_request('options_deballe_zip_mode_document')?'document':null);
267                }
268                return $files;
269        }
270        return _T('avis_operation_impossible');
271}
272
273if (!function_exists('fixer_extension_document')){
274/**
275 * Cherche dans la base le type-mime du tableau representant le document
276 * et corrige le nom du fichier ; retourne array(extension, nom corrige)
277 * s'il ne trouve pas, retourne '' et le nom inchange
278 *
279 * @param unknown_type $doc
280 * @return unknown
281 */
282// http://doc.spip.org/@fixer_extension_document
283function fixer_extension_document($doc) {
284        $extension = '';
285        $name = $doc['name'];
286        if (preg_match(',[.]([^.]+)$,', $name, $r)
287         AND $t = sql_fetsel("extension", "spip_types_documents",       "extension=" . sql_quote(corriger_extension($r[1])))
288         ) {
289                $extension = $t['extension'];
290                $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension;
291        }
292        else if ($t = sql_fetsel("extension", "spip_types_documents",   "mime_type=" . sql_quote($doc['type']))) {
293                $extension = $t['extension'];
294                $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension;
295        }
296
297        return array($extension,$name);
298}
299}
300?>
Note: See TracBrowser for help on using the repository browser.