source: spip-zone/_plugins_/ddUpload/action/joindre.php @ 38537

Last change on this file since 38537 was 38537, checked in by renato@…, 10 years ago

debut d'un plugin pour permettre a SPIP de faire des telechangements avec le d&d et avoir une barre de progression

File size: 9.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2010                                                *
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;
14
15include_spip('inc/charsets'); # pour le nom de fichier
16include_spip('inc/actions');
17
18// http://doc.spip.org/@action_joindre_dist
19function action_joindre_dist()
20{
21        global $redirect;
22        $securiser_action = charger_fonction('securiser_action', 'inc');
23        $arg = $securiser_action();
24
25        if (!preg_match(',^(-?\d+)\D(\d+)\D(\w+)/(\w+)$,',$arg,$r)) {
26                spip_log("action_joindre_dist incompris: " . $arg);
27                $redirect = urldecode(_request('redirect'));
28                return;
29        }
30
31        list(, $id, $id_document, $mode, $type) = $r;
32
33        $actifs = array();
34        $redirect = action_joindre_sous_action($id, $id_document, $mode, $type, $actifs);
35}
36
37// http://doc.spip.org/@action_joindre_sous_action
38function action_joindre_sous_action($id, $id_document, $mode, $type, &$documents_actifs)
39{
40        $hash = _request('hash');
41        $url = _request('url');
42        $chemin = _request('chemin');
43        $ancre = _request('ancre');
44        $sousaction1 = _request('sousaction1');
45        $sousaction2 = _request('sousaction2');
46        $sousaction3 = _request('sousaction3');
47        $sousaction4 = _request('sousaction4');
48        $sousaction5 = _request('sousaction5'); // decompacter un zip
49        $redirect = _request('redirect');
50        $iframe_redirect = _request('iframe_redirect');
51
52// pas terrible, mais c'est le pb du bouton Submit qui retourne son texte,
53// et son transcodage est couteux et perilleux
54        $sousaction = 
55       ($sousaction1 ? 1 :
56        ($sousaction2 ? 2 :
57         ($sousaction3 ? 3 : 
58          ($sousaction4 ? 4 :
59           $sousaction5 ))));
60 
61  if (isset($_SERVER['HTTP_X_FILE_NAME']) && isset($_SERVER['CONTENT_LENGTH'])) { 
62    if($_SERVER['CONTENT_LENGTH']>0) {
63      $uploadedContent = file_get_contents("php://input");
64      file_put_contents(
65        $tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'), 
66        base64_decode(substr($uploadedContent,strpos($uploadedContent,",")))
67      );
68      $path = array(
69        array("name" => $_SERVER['HTTP_X_FILE_NAME'], "tmp_name" => $tmp_dir, "error" => 0)
70      );
71    } else {
72      $path = array(array("error" => 4));   
73    }
74        } else {
75    $path = ($sousaction1 ? ($_FILES ? $_FILES : $GLOBALS['HTTP_POST_FILES']) :
76                ($sousaction2 ? $url : $chemin));
77        }
78
79        $sousaction = charger_fonction('joindre' . $sousaction, 'inc');
80        $type_image = $sousaction($path, $mode, $type, $id, $id_document, 
81                 $hash, $redirect, $documents_actifs, $iframe_redirect);
82
83        $redirect = urldecode($redirect);
84        if ($documents_actifs) {
85                $redirect = parametre_url($redirect,'show_docs',join(',',$documents_actifs),'&');
86        }
87
88        if (!$ancre) {
89                if ($mode=='image')
90                        $ancre = 'images';
91                else if ($type_image)
92                        $ancre = 'portfolio';
93                else
94                        $ancre = 'documents';
95        }
96
97        $redirect .= '#' . $ancre;
98        if ($type == 'rubrique') {
99                include_spip('inc/rubriques');
100                calculer_rubriques_if($id, array('statut' => 'publie'));
101        }
102
103        if(_request("iframe") == 'iframe') {
104                $redirect = parametre_url(urldecode($iframe_redirect),"show_docs",join(',',$documents_actifs),'&')."&iframe=iframe";
105        }
106        return $redirect;
107}
108
109// Cas d'un document distant reference sur internet
110
111// http://doc.spip.org/@inc_joindre2_dist
112function inc_joindre2_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
113{
114        return joindre_documents(array(
115                                   array('name' => basename($path),
116                                         'tmp_name' => $path)
117                                   ), 'distant', $type, $id, $id_document,
118                             $hash, $redirect, $actifs, $iframe_redirect);
119}
120
121// Cas d'un fichier transmis
122
123// http://doc.spip.org/@inc_joindre1_dist
124function inc_joindre1_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
125{
126        $files = array();
127        if (is_array($path))
128          foreach ($path as $file) {
129          //UPLOAD_ERR_NO_FILE
130                if (!($file['error'] == 4) )
131                        $files[]=$file;
132        }
133
134        return joindre_documents($files, $mode, $type, $id, $id_document,
135                             $hash, $redirect, $actifs, $iframe_redirect);
136} 
137
138// copie de tout ou partie du repertoire upload
139
140// http://doc.spip.org/@inc_joindre3_dist
141function inc_joindre3_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
142{
143        if (!$path || strstr($path, '..')) return;
144           
145        $upload = determine_upload();
146        if ($path != '/' AND $path != './') $upload .= $path;
147
148        if (!is_dir($upload))
149          // seul un fichier est demande
150          $files = array(array ('name' => basename($upload),
151                                'tmp_name' => $upload)
152                         );
153        else {
154          include_spip('inc/documents');
155          $files = array();
156          foreach (preg_files($upload) as $fichier) {
157                        $files[]= array (
158                                        'name' => basename($fichier),
159                                        'tmp_name' => $fichier
160                                        );
161          }
162        }
163
164        return joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, $actifs, $iframe_redirect);
165}
166
167//
168// Charger la fonction surchargeable receptionnant un fichier
169// et l'appliquer sur celui ou ceux indiques.
170
171// http://doc.spip.org/@joindre_documents
172function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect)
173{
174        $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
175
176        if (function_exists('gzopen') 
177        AND !($mode == 'distant')
178        AND (count($files) == 1)
179        AND (preg_match('/\.zip$/i', $files[0]['name'])
180             OR ($files[0]['type'] == 'application/zip'))) {
181       
182          // on pose le fichier dans le repertoire zip
183          // (nota : copier_document n'ecrase pas un fichier avec lui-meme
184          // ca autorise a boucler)
185                $desc = $files[0];
186                $zip = copier_document("zip",
187                                        $desc['name'],
188                                        $desc['tmp_name']
189                                );
190                // Est-ce qu'on sait le lire ?
191                include_spip('inc/pclzip');
192                $archive = $zip ? new PclZip($zip) : '';
193                if ($archive) {
194                        $valables = verifier_compactes($archive);
195                        if ($valables) {
196                                if (rename($zip, $tmp = _DIR_TMP.basename($zip))) {
197                                        echo $ajouter_documents($valables, $tmp, $type, $id, $mode, $id_document, $actifs, $hash, $redirect, $iframe_redirect);
198        // a tout de suite en joindre4, joindre5, ou joindre6
199                                        exit;
200                                }
201                        }
202                }
203        }
204
205        foreach ($files as $arg) {
206                // verifier l'extension du fichier en fonction de son type mime
207                list($extension,$arg['name']) = fixer_extension_document($arg);
208                check_upload_error($arg['error']);
209                $x = $ajouter_documents($arg['tmp_name'], $arg['name'], 
210                                    $type, $id, $mode, $id_document, $actifs);
211        }
212        // un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique
213        include_spip('inc/invalideur');
214        suivre_invalideur("id='id_$type/$id'");
215        return $x;
216}
217
218#-----------------------------------------------------------------------
219
220// sous-actions suite a l'envoi d'un Zip:
221// la fonction joindre_documents ci-dessus a construit un formulaire
222// qui renvoie sur une des 3 sous-actions qui suivent.
223
224//  Zip avec confirmation "tel quel"
225
226// http://doc.spip.org/@inc_joindre5_dist
227function inc_joindre5_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
228{
229        $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
230        return $ajouter_documents($path, basename($path), $type, $id, $mode, $id_document, $actifs);
231}
232
233// Zip a deballer.
234
235// http://doc.spip.org/@inc_joindre6_dist
236function inc_joindre6_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
237{
238        $x = joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
239        //  suppression de l'archive en zip
240        spip_unlink($path);
241        return $x;
242}
243
244// Zip avec les 2 options a la fois
245
246// http://doc.spip.org/@inc_joindre4_dist
247function inc_joindre4_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
248{
249        joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
250        return inc_joindre5_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
251}
252
253// http://doc.spip.org/@joindre_deballes
254function joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
255{
256            $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
257            define('_tmp_dir', creer_repertoire_documents($hash));
258
259            if (_tmp_dir == _DIR_IMG)
260              {include_spip('inc/minipres');
261                echo minipres(_T('avis_operation_impossible'));
262                exit;
263              }
264            include_spip('inc/pclzip');
265            $archive = new PclZip($path);
266            $archive->extract(
267                              PCLZIP_OPT_PATH, _tmp_dir,
268                              PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
269                              );
270            $contenu = verifier_compactes($archive);
271            $titrer = _request('titrer') == 'on';
272            foreach ($contenu as $fichier => $size) {
273                $f = basename($fichier);
274                $x = $ajouter_documents(_tmp_dir. $f, $f,
275                        $type, $id, $mode, $id_document, $actifs, $titrer);
276            }
277            effacer_repertoire_temporaire(_tmp_dir);
278            return $x;
279}
280?>
Note: See TracBrowser for help on using the repository browser.