Esempio n. 1
0
function formulaires_editer_balade_verifier_dist($id_collection = 'new', $retour = '')
{
    $erreurs = array();
    if (isset($_FILES['import']) && $_FILES['import']['error'] != 4) {
        include_spip('action/ajouter_documents');
        $infos_doc = verifier_upload_autorise($_FILES['import']['name']);
        if (in_array($infos_doc['extension'], array('gpx', 'kml'))) {
            unset($erreurs['titre']);
            unset($erreurs['zoom']);
        } else {
            $erreurs['import'] = _T('medias:erreur_upload_type_interdit', array('nom' => $_FILES['import']['name']));
        }
    }
    return $erreurs;
}
/**
 * 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();
}
/**
 * Tester le type de document
 *
 * - le document existe et n'est pas de taille 0 ?
 * - interdit a l'upload ?
 * - quelle extension dans spip_types_documents ?
 * - est-ce "inclus" comme une image ?
 *
 * Le zipper si necessaire
 *
 * @param array $file
 *     Au format $_FILES
 * @param string $mode
 *     Mode d'inclusion du fichier, si connu
 * @return array
 */
function fixer_fichier_upload($file, $mode = '')
{
    /**
     * On vérifie que le fichier existe et qu'il contient quelque chose
     */
    if (is_array($row = verifier_upload_autorise($file['name'], $mode))) {
        if (!isset($row['autozip'])) {
            $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        } else {
            unset($row['autozip']);
            $ext = 'zip';
            if (!($tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))) {
                return false;
            }
            spip_unlink($tmp_dir);
            @mkdir($tmp_dir);
            include_spip('inc/charsets');
            $tmp = $tmp_dir . '/' . translitteration($file['name']);
            $file['name'] .= '.' . $ext;
            # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
            // deplacer le fichier tmp_name dans le dossier tmp
            deplacer_fichier_upload($file['tmp_name'], $tmp, true);
            include_spip('inc/pclzip');
            $source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
            $archive = new PclZip($source);
            $v_list = $archive->create($tmp, PCLZIP_OPT_REMOVE_PATH, $tmp_dir, PCLZIP_OPT_ADD_PATH, '');
            effacer_repertoire_temporaire($tmp_dir);
            if (!$v_list) {
                spip_log("Echec creation du zip ");
                return false;
            }
            $row['fichier'] = copier_document($row['extension'], $file['name'], $source);
            spip_unlink($source);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        }
    } else {
        return $row;
    }
    // retourner le message d'erreur
}