/** * 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(); }
/** * Vérification du formulaire * * @param int|string $id_document * L'identidiant numérique du document s'il est à remplacer, sinon "new" * @param int $id_objet * L'identifiant numérique de l'objet sur lequel on ajoute le document * @param string $objet * Le type de l'objet sur lequel on ajoute le document * @param string $mode * Le mode du document (auto,choix,document,image,vignette...), par défaut auto * @param string $galerie * Passer optionnellement une galerie jointe au form, plus utilise nativement, * on prefere la mise a jour apres upload par ajaxReload('documents') * @param bool|string $proposer_media * Doit on afficher la médiathèque ? par défaut oui * Valeurs possibles si string : false,'non','no'. * @param bool|string $proposer_ftp * Doit on afficher le ftp ? par défaut oui * Valeurs possibles si string : false,'non','no'. * @return array $erreurs * Les erreurs éventuelles dans un tableau */ function formulaires_joindre_document_verifier_dist($id_document = 'new', $id_objet = 0, $objet = '', $mode = 'auto', $galerie = false, $proposer_media = true, $proposer_ftp = true) { include_spip('inc/joindre_document'); $erreurs = array(); // on joint un document deja dans le site if (_request('joindre_mediatheque')) { $refdoc_joindre = intval(preg_replace(',^(doc|document|img),', '', _request('refdoc_joindre'))); if (!sql_getfetsel('id_document', 'spip_documents', 'id_document=' . intval($refdoc_joindre))) { $erreurs['message_erreur'] = _T('medias:erreur_aucun_document'); } } else { $files = joindre_trouver_fichier_envoye(); if (is_string($files)) { $erreurs['message_erreur'] = $files; } elseif (is_array($files)) { // erreur si on a pas trouve de fichier if (!count($files)) { $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); } else { // regarder si on a eu une erreur sur l'upload d'un fichier foreach ($files as $file) { if (isset($file['error']) and $test = joindre_upload_error($file['error'])) { if (is_string($test)) { $erreurs['message_erreur'] = $test; } else { $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); } } } // si ce n'est pas deja un post de zip confirme // regarder si il faut lister le contenu du zip et le presenter if (!count($erreurs) and !_request('joindre_zip') and $contenu_zip = joindre_verifier_zip($files)) { list($fichiers, $erreurs, $tmp_zip) = $contenu_zip; if ($fichiers) { // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session $token_zip = md5($tmp_zip); $erreurs['message_erreur'] = ''; $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe", array('chemin_zip' => $token_zip, 'liste_fichiers_zip' => $fichiers, 'erreurs_fichier_zip' => $erreurs)); } else { $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); } } } } if (count($erreurs) and defined('_tmp_dir')) { effacer_repertoire_temporaire(_tmp_dir); } } return $erreurs; }