/_plugins_/ddUpload/action/joindre.php
PHP | 306 lines | 283 code | 10 blank | 13 comment | 6 complexity | fbffb1a1e9da19989dda3d50e6f6cf8b MD5 | raw file
- <?php
- /***************************************************************************\
- * SPIP, Systeme de publication pour l'internet *
- * *
- * Copyright (c) 2001-2010 *
- * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
- * *
- * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
- * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
- \***************************************************************************/
- if (!defined("_ECRIRE_INC_VERSION")) return;
- include_spip('inc/charsets'); # pour le nom de fichier
- include_spip('inc/actions');
- // http://doc.spip.org/@action_joindre_dist
- function action_joindre_dist()
- {
- global $redirect;
- $securiser_action = charger_fonction('securiser_action', 'inc');
- $arg = $securiser_action();
- if (!preg_match(',^(-?\d+)\D(\d+)\D(\w+)/(\w+)$,',$arg,$r)) {
- spip_log("action_joindre_dist incompris: " . $arg);
- $redirect = urldecode(_request('redirect'));
- return;
- }
- list(, $id, $id_document, $mode, $type) = $r;
- $actifs = array();
- $redirect = action_joindre_sous_action($id, $id_document, $mode, $type, $actifs);
- }
- // http://doc.spip.org/@action_joindre_sous_action
- function action_joindre_sous_action($id, $id_document, $mode, $type, &$documents_actifs)
- {
- $hash = _request('hash');
- $url = _request('url');
- $chemin = _request('chemin');
- $ancre = _request('ancre');
- $sousaction1 = _request('sousaction1');
- $sousaction2 = _request('sousaction2');
- $sousaction3 = _request('sousaction3');
- $sousaction4 = _request('sousaction4');
- $sousaction5 = _request('sousaction5'); // decompacter un zip
- $redirect = _request('redirect');
- $iframe_redirect = _request('iframe_redirect');
- // pas terrible, mais c'est le pb du bouton Submit qui retourne son texte,
- // et son transcodage est couteux et perilleux
- $sousaction =
- ($sousaction1 ? 1 :
- ($sousaction2 ? 2 :
- ($sousaction3 ? 3 :
- ($sousaction4 ? 4 :
- $sousaction5 ))));
-
- if (isset($_SERVER['HTTP_X_FILE_NAME']) && isset($_SERVER['CONTENT_LENGTH'])) {
- if($_SERVER['CONTENT_LENGTH']>0) {
- $handle = fopen("php://input","rb");
- $block = fread($handle,4096);
- $blocklen = strlen($block);
- $base64 = false;
- $dest = tempnam(_DIR_TMP, 'tmp_upload');
- $handle_dest = fopen($dest,"ab");
- if (preg_match("/^data:[^;]+(;charset=\"[^\"]+\")?(;base64)?,/",$block,$m)) {
- //data uri
- $base64 = $m[2];
- $block = substr($block,strlen($m[0]));
- if($base64) {
- $blocklen -= $m[0];
- $blockleft = $blocklen % 4;
- if($blockleft) {
- $block .= fread($handle,$blockleft);
- }
- $block = base64_decode($block);
- }
- }
- fwrite($handle_dest,$block);
- while($block = fread($handle,4096)) {
- if($base64)
- $block = base64_decode($block);
- fwrite($handle_dest,$block);
- }
- fclose($handle);
- fclose($handle_dest);
- $path = array(
- array("name" => $_SERVER['HTTP_X_FILE_NAME'], "tmp_name" => $dest, "error" => 0)
- );
- } else {
- spip_log("file upload error");
- $path = array(array("error" => 4));
- }
- } else {
- $path = ($sousaction1 ? ($_FILES ? $_FILES : $GLOBALS['HTTP_POST_FILES']) :
- ($sousaction2 ? $url : $chemin));
- }
- $sousaction = charger_fonction('joindre' . $sousaction, 'inc');
- $type_image = $sousaction($path, $mode, $type, $id, $id_document,
- $hash, $redirect, $documents_actifs, $iframe_redirect);
-
- if($dest)
- @unlink($dest);
-
- $redirect = urldecode($redirect);
- if ($documents_actifs) {
- $redirect = parametre_url($redirect,'show_docs',join(',',$documents_actifs),'&');
- }
- if (!$ancre) {
- if ($mode=='image')
- $ancre = 'images';
- else if ($type_image)
- $ancre = 'portfolio';
- else
- $ancre = 'documents';
- }
- $redirect .= '#' . $ancre;
- if ($type == 'rubrique') {
- include_spip('inc/rubriques');
- calculer_rubriques_if($id, array('statut' => 'publie'));
- }
- if(_request("iframe") == 'iframe') {
- $redirect = parametre_url(urldecode($iframe_redirect),"show_docs",join(',',$documents_actifs),'&')."&iframe=iframe&var_noajax=1";
- }
- return $redirect;
- }
- // Cas d'un document distant reference sur internet
- // http://doc.spip.org/@inc_joindre2_dist
- function inc_joindre2_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
- {
- return joindre_documents(array(
- array('name' => basename($path),
- 'tmp_name' => $path)
- ), 'distant', $type, $id, $id_document,
- $hash, $redirect, $actifs, $iframe_redirect);
- }
- // Cas d'un fichier transmis
- // http://doc.spip.org/@inc_joindre1_dist
- function inc_joindre1_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
- {
- $files = array();
- if (is_array($path))
- foreach ($path as $file) {
- //UPLOAD_ERR_NO_FILE
- if (!($file['error'] == 4) )
- $files[]=$file;
- }
- return joindre_documents($files, $mode, $type, $id, $id_document,
- $hash, $redirect, $actifs, $iframe_redirect);
- }
- // copie de tout ou partie du repertoire upload
- // http://doc.spip.org/@inc_joindre3_dist
- function inc_joindre3_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
- {
- if (!$path || strstr($path, '..')) return;
-
- $upload = determine_upload();
- if ($path != '/' AND $path != './') $upload .= $path;
- if (!is_dir($upload))
- // seul un fichier est demande
- $files = array(array ('name' => basename($upload),
- 'tmp_name' => $upload)
- );
- else {
- include_spip('inc/documents');
- $files = array();
- foreach (preg_files($upload) as $fichier) {
- $files[]= array (
- 'name' => basename($fichier),
- 'tmp_name' => $fichier
- );
- }
- }
- return joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, $actifs, $iframe_redirect);
- }
- //
- // Charger la fonction surchargeable receptionnant un fichier
- // et l'appliquer sur celui ou ceux indiques.
- // http://doc.spip.org/@joindre_documents
- function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect)
- {
- $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
- if (function_exists('gzopen')
- AND !($mode == 'distant')
- AND (count($files) == 1)
- AND (preg_match('/\.zip$/i', $files[0]['name'])
- OR ($files[0]['type'] == 'application/zip'))) {
-
- // on pose le fichier dans le repertoire zip
- // (nota : copier_document n'ecrase pas un fichier avec lui-meme
- // ca autorise a boucler)
- $desc = $files[0];
- $zip = copier_document("zip",
- $desc['name'],
- $desc['tmp_name']
- );
- // Est-ce qu'on sait le lire ?
- include_spip('inc/pclzip');
- $archive = $zip ? new PclZip($zip) : '';
- if ($archive) {
- $valables = verifier_compactes($archive);
- if ($valables) {
- if (rename($zip, $tmp = _DIR_TMP.basename($zip))) {
- echo $ajouter_documents($valables, $tmp, $type, $id, $mode, $id_document, $actifs, $hash, $redirect, $iframe_redirect);
- // a tout de suite en joindre4, joindre5, ou joindre6
- exit;
- }
- }
- }
- }
- foreach ($files as $arg) {
- // verifier l'extension du fichier en fonction de son type mime
- list($extension,$arg['name']) = fixer_extension_document($arg);
- check_upload_error($arg['error']);
- $x = $ajouter_documents($arg['tmp_name'], $arg['name'],
- $type, $id, $mode, $id_document, $actifs);
- }
- // un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique
- include_spip('inc/invalideur');
- suivre_invalideur("id='id_$type/$id'");
- return $x;
- }
- #-----------------------------------------------------------------------
- // sous-actions suite a l'envoi d'un Zip:
- // la fonction joindre_documents ci-dessus a construit un formulaire
- // qui renvoie sur une des 3 sous-actions qui suivent.
- // Zip avec confirmation "tel quel"
- // http://doc.spip.org/@inc_joindre5_dist
- function inc_joindre5_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
- {
- $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
- return $ajouter_documents($path, basename($path), $type, $id, $mode, $id_document, $actifs);
- }
- // Zip a deballer.
- // http://doc.spip.org/@inc_joindre6_dist
- function inc_joindre6_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
- {
- $x = joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
- // suppression de l'archive en zip
- spip_unlink($path);
- return $x;
- }
- // Zip avec les 2 options a la fois
- // http://doc.spip.org/@inc_joindre4_dist
- function inc_joindre4_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs, $iframe_redirect)
- {
- joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
- return inc_joindre5_dist($path, $mode, $type, $id, $id_document,$hash, $redirect, $actifs);
- }
- // http://doc.spip.org/@joindre_deballes
- function joindre_deballes($path, $mode, $type, $id, $id_document,$hash, $redirect, &$actifs)
- {
- $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
- define('_tmp_dir', creer_repertoire_documents($hash));
- if (_tmp_dir == _DIR_IMG)
- {include_spip('inc/minipres');
- echo minipres(_T('avis_operation_impossible'));
- exit;
- }
- include_spip('inc/pclzip');
- $archive = new PclZip($path);
- $archive->extract(
- PCLZIP_OPT_PATH, _tmp_dir,
- PCLZIP_CB_PRE_EXTRACT, 'callback_deballe_fichier'
- );
- $contenu = verifier_compactes($archive);
- $titrer = _request('titrer') == 'on';
- foreach ($contenu as $fichier => $size) {
- $f = basename($fichier);
- $x = $ajouter_documents(_tmp_dir. $f, $f,
- $type, $id, $mode, $id_document, $actifs, $titrer);
- }
- effacer_repertoire_temporaire(_tmp_dir);
- return $x;
- }
- ?>