function admin_repair_plat(){ spip_log("verification des documents joints"); $out = ""; $repertoire = array(); include_spip('inc/getdocument'); $res = sql_select('*','spip_documents',"fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'"); while ($row=sql_fetch($res)){ $ext = $row['extension']; if (!$ext) { spip_log("document sans extension: " . $row['id_document']); continue; } if (!isset($repertoire[$ext])){ if (@file_exists($plat = _DIR_IMG. $ext .".plat")) spip_unlink($plat); $repertoire[$ext] = creer_repertoire_documents($ext); if (preg_match(',_$,',$repertoire[$ext])) $repertoire[$ext] = false; } if ($d=$repertoire[$ext]){ $d = substr($d,strlen(_DIR_IMG)); $src = $row['fichier']; $dest = $d . substr($src,strlen($d)); if (deplacer_fichier_upload(_DIR_IMG . $src, _DIR_IMG . $dest)) { sql_updateq('spip_documents',array('fichier'=>$dest),'id_document='.intval($row['id_document'])); spip_unlink(_DIR_IMG . $src); $out .= "$src => $dest<br />"; } } } return $out; }
function copier_document($ext, $orig, $source) { $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc $dir = creer_repertoire_documents($ext); $dest = preg_replace("/[^.=\w-]+/", "_", translitteration(preg_replace("/\.([^.]+)$/", "", preg_replace("/<[^>]*>/", '', basename($orig))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); // Si le document "source" est deja au bon endroit, ne rien faire if ($source == ($dir . $dest . '.' . $ext)) return $source; // sinon tourner jusqu'a trouver un numero correct $n = 0; while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext)); return deplacer_fichier_upload($source, $newFile); }
function nom_fichier_copie_locale($source, $extension) { include_spip('inc/documents'); $d = creer_repertoire_documents('distant'); # IMG/distant/ $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ // on se place tout le temps comme si on etait a la racine if (_DIR_RACINE) { $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); } $m = md5($source); return $d . substr(preg_replace(',[^\\w-],', '', basename($source)) . '-' . $m, 0, 12) . substr($m, 0, 4) . ".{$extension}"; }
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; }
/** * Recuperer le nom du fichier selon le mode d'upload choisi * et mettre cela au format $_FILES * * Renvoie une liste de fichier ou un message en cas d'erreur * * @return string/array */ function joindre_trouver_fichier_envoye() { static $files = array(); // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif // lorsqu'on est appelle au traitement if (count($files)) { return $files; } if (_request('joindre_upload')) { $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES']; $files = array(); if (is_array($post)) { include_spip('action/ajouter_documents'); foreach ($post as $file) { if (is_array($file['name'])) { while (count($file['name'])) { $test = array('error' => array_shift($file['error']), 'name' => array_shift($file['name']), 'tmp_name' => array_shift($file['tmp_name']), 'type' => array_shift($file['type'])); if (!($test['error'] == 4)) { if (is_string($err = joindre_upload_error($test['error']))) { return $err; } // un erreur upload if (!is_array(verifier_upload_autorise($test['name']))) { return _T('medias:erreur_upload_type_interdit', array('nom' => $test['name'])); } $files[] = $test; } } } else { //UPLOAD_ERR_NO_FILE if (!($file['error'] == 4)) { if (is_string($err = joindre_upload_error($file['error']))) { return $err; } // un erreur upload if (!is_array(verifier_upload_autorise($file['name']))) { return _T('medias:erreur_upload_type_interdit', array('nom' => $file['name'])); } $files[] = $file; } } } if (!count($files)) { return _T('medias:erreur_indiquez_un_fichier'); } } return $files; } elseif (_request('joindre_distant')) { $path = _request('url'); if (!strlen($path) or $path == 'http://') { return _T('medias:erreur_indiquez_un_fichier'); } include_spip('action/ajouter_documents'); $infos = renseigner_source_distante($path); if (!is_array($infos)) { return $infos; } else { return array(array('name' => basename($path), 'tmp_name' => $path, 'distant' => true)); } } elseif (_request('joindre_ftp')) { $path = _request('cheminftp'); if (!$path || strstr($path, '..')) { return _T('medias:erreur_indiquez_un_fichier'); } include_spip('inc/documents'); include_spip('inc/actions'); $upload = determine_upload(); if ($path != '/' and $path != './') { $upload .= $path; } if (!is_dir($upload)) { return array(array('name' => basename($upload), 'tmp_name' => $upload)); } else { // on upload tout un repertoire $files = array(); foreach (preg_files($upload) as $fichier) { $files[] = array('name' => basename($fichier), 'tmp_name' => $fichier); } return $files; } } elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) { $zip_to_clean = isset($GLOBALS['visiteur_session']['zip_to_clean']) ? unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array(); if (!$zip_to_clean or !isset($zip_to_clean[$token_zip]) or !($path = $zip_to_clean[$token_zip])) { return _T('avis_operation_impossible'); } include_spip('inc/documents'); //pour creer_repertoire_documents define('_tmp_zip', $path); define('_tmp_dir', creer_repertoire_documents(md5($path . $GLOBALS['visiteur_session']['id_auteur']))); if (_tmp_dir == _DIR_IMG) { return _T('avis_operation_impossible'); } $files = array(); if (_request('options_upload_zip') == 'deballe') { $files = joindre_deballer_lister_zip($path, _tmp_dir); } // si le zip doit aussi etre conserve, l'ajouter if (_request('options_upload_zip') == 'upload' or _request('options_deballe_zip_conserver')) { $files[] = array('name' => basename($path), 'tmp_name' => $path); } return $files; } return array(); }