source: spip-zone/_plugins_/cvt-upload/cvtupload_pipelines.php @ 63357

Last change on this file since 63357 was 63357, checked in by rastapopoulos@…, 7 years ago

Oublié un commit : mettre en correspondance avec le format FILES habituel, donc utilisable ensuite pour les fonctions d'ajout de document de SPIP

File size: 6.6 KB
Line 
1<?php
2
3// Sécurité
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6function cvtupload_chercher_fichiers($form, $args){
7        if ($fonction_fichiers = charger_fonction('fichiers', 'formulaires/'.$form, true)
8                and $fichiers = call_user_func_array($fonction_fichiers, $args)
9                and is_array($fichiers)
10                and $fichiers = pipeline(
11                        'formulaire_fichiers',
12                        array('args'=>array('form'=>$form, 'args'=>$args), 'data'=>$fichiers)
13                )
14                and is_array($fichiers)
15        ){
16                return $fichiers;
17        }
18
19        return false;
20}
21
22function cvtupload_hash(){
23        include_spip('inc/session');
24        return session_get('hash_env').'_'._request('hash');
25}
26
27function cvtupload_formulaire_charger($flux){
28        // S'il y a des champs fichiers de déclarés
29        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
30                $contexte =& $flux['data'];
31                // S'il n'y a pas déjà une action de configurée, on en force une pour avoir un hash unique par visiteur
32                if (!$contexte['_action'])
33                        $contexte['_action'] = array('cvtupload', 'cvtupload');
34        }
35       
36        return $flux;
37}
38
39function cvtupload_formulaire_verifier($flux){
40        // S'il y a des champs fichiers de déclarés
41        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
42                $erreurs =& $flux['data'];
43                include_spip('inc/filtres');
44                include_spip('inc/documents');
45                include_spip('inc/getdocument');
46                include_spip('inc/charsets');
47               
48                $hash = cvtupload_hash();
49               
50                //Si le répertoire temporaire n'existe pas encore, il faut le créer.
51                $repertoire_tmp = sous_repertoire(_DIR_TMP.'cvtupload/');
52                $repertoire_tmp = sous_repertoire($repertoire_tmp, $hash.'/');
53               
54                // On parcourt les champs déclarés comme étant des fichiers
55                $infos_fichiers = session_get($hash.'_fichiers') ? session_get($hash.'_fichiers') : array();
56                foreach ($champs_fichiers as $champ){
57                        if ($_FILES[$champ]){
58                                $infos = cvtupload_deplacer_fichier($_FILES[$champ], $repertoire_tmp);
59                                if (isset($infos_fichiers[$champ]))
60                                        $infos_fichiers[$champ] = array_merge($infos_fichiers[$champ], $infos);
61                                else
62                                        $infos_fichiers[$champ] = $infos;
63                        }
64                }
65                set_request('_fichiers', $infos_fichiers);
66                session_set($hash.'_fichiers', $infos_fichiers);
67        }
68       
69        return $flux;
70}
71
72function cvtupload_formulaire_fond($flux){
73        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
74        if ($flux['args']['je_suis_poste']
75                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
76        ){
77                $fichiers = _request('_fichiers');
78                foreach ($champs_fichiers as $champ){
79                        // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
80                        if (isset($fichiers[$champ])){
81                                include_spip('inc/filtres_images');
82                                // Si c'est un champ unique
83                                if (isset($fichiers[$champ]['name'])){
84                                        $flux['data'] = preg_replace(
85                                                "#<input[^>]*name=['\"]${champ}[^>]*>#i",
86                                                image_reduire($fichiers[$champ]['vignette'],32).' '.$fichiers[$champ]['name'],
87                                                $flux['data']
88                                        );
89                                }
90                                // Sinon c'est un multiple
91                                else{
92                                        foreach($fichiers[$champ] as $cle=>$fichier){
93                                                $flux['data'] = preg_replace(
94                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
95                                                        image_reduire($fichier['vignette'],32).' '.$fichier['name'],
96                                                        $flux['data'],
97                                                        1 // seul le premier trouvé est remplacé
98                                                );
99                                        }
100                                }
101                        }
102                }
103        }
104        return $flux;
105}
106
107function cvtupload_formulaire_traiter($flux){
108        // S'il y a des champs fichiers de déclarés
109        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
110                $hash = cvtupload_hash();
111                // On supprime le répertoire unique comportant les fichiers du visiteur
112                $repertoire = _DIR_TMP.'cvtupload/'.$hash.'/';
113                supprimer_repertoire($repertoire);
114                session_set($hash.'_fichiers', null);
115        }
116       
117        return $flux;
118}
119
120/*
121 * Déplace un fichier uploadé dans un endroit temporaire et retourne des informations dessus
122 *
123 * @param array $fichier Le morceau de $_FILES concernant le ou les fichiers
124 * @param string $$repertoire Chemin de destination des fichiers
125 * @return array Retourne un tableau d'informations sur le fichier ou un tableau de tableaux si plusieurs fichiers. Ce tableau est compatible avec l'action "ajouter_un_fichier" de SPIP.
126 */
127function cvtupload_deplacer_fichier($fichier, $repertoire){
128        $vignette_par_defaut = charger_fonction('vignette', 'inc/');
129        $infos = array();
130        if (is_array($fichier['name'])){
131                foreach ($fichier['name'] as $cle=>$nom){
132                        // On commence par transformer le nom du fichier pour éviter les conflits
133                        $nom = trim(preg_replace('/[\s]+/', '_', strtolower(translitteration($nom))));
134                        // Si le fichier a bien un nom et qu'il n'y a pas d'erreur associé à ce fichier
135                        if (($nom != null) and ($fichier['error'][$cle] == 0)) {
136                                //On vérifie qu'un fichier ne porte pas déjà le même nom, sinon on lui donne un nom aléatoire + nom original
137                                if (file_exists($repertoire.$nom))
138                                        $nom = $nom.'_'.rand();
139                                // Déplacement du fichier vers le dossier de réception temporaire + récupération d'infos
140                                if (deplacer_fichier_upload($fichier['tmp_name'][$cle], $repertoire.$nom, true)) {
141                                        $infos[$cle]['tmp_name'] = $repertoire.$nom;
142                                        $infos[$cle]['name'] = $nom;
143                                        // On en déduit l'extension et du coup la vignette
144                                        $infos[$cle]['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $fichier['name'][$cle]));
145                                        $infos[$cle]['vignette'] = $vignette_par_defaut($infos[$cle]['extension'], false, true);
146                                        //On récupère le type MIME du fichier aussi
147                                        $infos[$cle]['mime'] = $fichier['type'][$cle];
148                                }
149                        }
150                }
151        }
152        else{
153                // On commence par transformer le nom du fichier pour éviter les conflits
154                $nom = trim(preg_replace('/[\s]+/', '_', strtolower(translitteration($fichier['name']))));
155                // Si le fichier a bien un nom et qu'il n'y a pas d'erreur associé à ce fichier
156                if (($nom != null) && ($fichier['error'] == 0)) {
157                        //On vérifie qu'un fichier ne porte pas déjà le même nom, sinon on lui donne un nom aléatoire + nom original
158                        if (file_exists($repertoire.$nom))
159                                $nom = $nom.'_'.rand();
160                        // Déplacement du fichier vers le dossier de réception temporaire + récupération d'infos
161                        if (deplacer_fichier_upload($fichier['tmp_name'], $repertoire.$nom, true)) {
162                                $infos['tmp_name'] = $repertoire.$nom;
163                                $infos['name'] = $nom;
164                                // On en déduit l'extension et du coup la vignette
165                                $infos['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $fichier['name']));
166                                $infos['vignette'] = $vignette_par_defaut($infos['extension'], false, true);
167                                //On récupère le type MIME du fichier aussi
168                                $infos['mime'] = $fichier['type'];
169                        }
170                }
171        }
172       
173        return $infos;
174}
175
176?>
Note: See TracBrowser for help on using the repository browser.