Пример #1
0
function rebuilt_file_db()
{
    $idir = rm_dots_dir(scandir($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images']));
    // scans also subdir of img/* (in one single array of paths)
    foreach ($idir as $i => $e) {
        $subelem = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'] . '/' . $e;
        if (is_dir($subelem)) {
            unset($idir[$i]);
            // rm folder entry itself
            $subidir = rm_dots_dir(scandir($subelem));
            foreach ($subidir as $j => $im) {
                $idir[] = $e . '/' . $im;
            }
        }
    }
    foreach ($idir as $i => $e) {
        $idir[$i] = '/' . $e;
    }
    $fdir = rm_dots_dir(scandir($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_fichiers']));
    // supprime les miniatures de la liste...
    $idir = array_filter($idir, function ($file) {
        return !(preg_match('#-thb\\.jpg$#', $file) or strpos($file, 'index.html') == 4);
    });
    $files_disk = array_merge($idir, $fdir);
    $files_db = $files_db_id = array();
    // supprime les fichiers dans la DB qui ne sont plus sur le disque
    foreach ($GLOBALS['liste_fichiers'] as $id => $file) {
        if (!in_array($file['bt_path'] . '/' . $file['bt_filename'], $files_disk)) {
            unset($GLOBALS['liste_fichiers'][$id]);
        }
        $files_db[] = $file['bt_path'] . '/' . $file['bt_filename'];
        $files_db_id[] = $file['bt_id'];
    }
    // ajoute les images/* du disque qui ne sont pas encore dans la DB.
    foreach ($idir as $file) {
        $filepath = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'] . '/' . $file;
        if (!in_array($file, $files_db)) {
            $time = filemtime($filepath);
            $id = date('YmdHis', $time);
            // vérifie que l’ID ne se trouve pas déjà dans le tableau. Sinon, modifie la date (en allant dans le passé)
            while (array_key_exists($id, $files_db_id)) {
                $time--;
                $id = date('YmdHis', $time);
            }
            $files_db_id[] = $id;
            $new_img = array('bt_id' => $id, 'bt_type' => 'image', 'bt_fileext' => strtolower(pathinfo($filepath, PATHINFO_EXTENSION)), 'bt_filesize' => filesize($filepath), 'bt_filename' => $file, 'bt_content' => '', 'bt_wiki_content' => '', 'bt_dossier' => 'default', 'bt_checksum' => sha1_file($filepath), 'bt_statut' => 0, 'bt_path' => preg_match('#^/[0-9a-f]{2}/#', $file) ? substr($file, 0, 3) : '');
            list($new_img['bt_dim_w'], $new_img['bt_dim_h']) = getimagesize($filepath);
            // l’ajoute au tableau
            $GLOBALS['liste_fichiers'][] = $new_img;
        }
        // crée une miniature de l’image
        create_thumbnail($filepath);
    }
    // fait pareil pour les files/*
    foreach ($fdir as $file) {
        if (!in_array($file, $files_db)) {
            $filepath = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_fichiers'] . '/' . $file;
            $time = filemtime($filepath);
            $id = date('YmdHis', $time);
            // vérifie que l’ID ne se trouve pas déjà dans le tableau. Sinon, modifie la date (en allant dans le passé)
            while (array_key_exists($id, $files_db_id)) {
                $time--;
                $id = date('YmdHis', $time);
            }
            $files_db_id[] = $id;
            $ext = strtolower(pathinfo($filepath, PATHINFO_EXTENSION));
            $new_file = array('bt_id' => $id, 'bt_type' => detection_type_fichier($ext), 'bt_fileext' => $ext, 'bt_filesize' => filesize($filepath), 'bt_filename' => $file, 'bt_content' => '', 'bt_wiki_content' => '', 'bt_dossier' => 'default', 'bt_checksum' => sha1_file($filepath), 'bt_statut' => 0, 'bt_path' => '');
            // l’ajoute au tableau
            $GLOBALS['liste_fichiers'][] = $new_file;
        }
    }
    // tri le tableau fusionné selon les bt_id (selon une des clés d'un sous tableau).
    $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id');
    // finalement enregistre la liste des fichiers.
    file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */');
}
Пример #2
0
function bdd_fichier($fichier, $quoi, $comment, $sup_var)
{
    if ($fichier['bt_type'] == 'image') {
        $dossier = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'] . $fichier['bt_path'];
    } else {
        $dossier = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_fichiers'];
        $rand_dir = '';
    }
    if (FALSE === creer_dossier($dossier, 0)) {
        die($GLOBALS['lang']['err_file_write']);
    }
    // ajout d’un nouveau fichier
    if ($quoi == 'ajout-nouveau') {
        $prefix = '';
        foreach ($GLOBALS['liste_fichiers'] as $files) {
            if ($fichier['bt_checksum'] == $files['bt_checksum']) {
                $fichier['bt_id'] = $files['bt_id'];
                return $fichier;
            }
        }
        // éviter d’écraser un fichier existant
        while (file_exists($dossier . '/' . $prefix . $fichier['bt_filename'])) {
            $prefix .= rand(0, 9);
        }
        $dest = $prefix . $fichier['bt_filename'];
        $fichier['bt_filename'] = $dest;
        // redéfinit le nom du fichier.
        // copie du fichier physique
        // Fichier uploadé s’il y a (sinon fichier téléchargé depuis l’URL)
        if ($comment == 'upload') {
            $new_file = $sup_var['tmp_name'];
            if (move_uploaded_file($new_file, $dossier . '/' . $dest)) {
                $fichier['bt_checksum'] = sha1_file($dossier . '/' . $dest);
            } else {
                redirection(basename($_SERVER['PHP_SELF']) . '?errmsg=error_fichier_ajout_2');
                exit;
            }
        } elseif ($comment == 'download' and copy($sup_var, $dossier . '/' . $dest)) {
            $fichier['bt_filesize'] = filesize($dossier . '/' . $dest);
        } else {
            redirection(basename($_SERVER['PHP_SELF']) . '?errmsg=error_fichier_ajout');
            exit;
        }
        // si fichier par POST ou par URL == OK, on l’ajoute à la base. (si pas OK, on serai déjà sorti par le else { redirection() }.
        if ($fichier['bt_type'] == 'image') {
            // miniature si c’est une image
            create_thumbnail($dossier . '/' . $dest);
            list($fichier['bt_dim_w'], $fichier['bt_dim_h']) = getimagesize($dossier . '/' . $dest);
        } else {
            $fichier['bt_path'] = '';
        }
        // ajout à la base.
        $GLOBALS['liste_fichiers'][] = $fichier;
        $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id');
        file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */');
    } elseif ($quoi == 'editer-existant') {
        $new_filename = $fichier['bt_filename'];
        $old_filename = $sup_var;
        if ($new_filename != $old_filename) {
            // nom du fichier a changé ? on déplace le fichier.
            $prefix = '';
            while (file_exists($dossier . '/' . $prefix . $new_filename)) {
                // évite d’avoir deux fichiers de même nom
                $prefix .= rand(0, 9);
            }
            $new_filename = $prefix . $fichier['bt_filename'];
            $fichier['bt_filename'] = $new_filename;
            // update file name in $fichier array(), with the new prefix.
            // rename file on disk
            if (rename($dossier . '/' . $old_filename, $dossier . '/' . $new_filename)) {
                // si c’est une image : renome la miniature si elle existe, sinon la crée
                if ($fichier['bt_type'] == 'image') {
                    if (($old_thb = chemin_thb_img_test($dossier . '/' . $old_filename)) != $dossier . '/' . $old_filename) {
                        rename($old_thb, chemin_thb_img($dossier . '/' . $new_filename));
                    } else {
                        create_thumbnail($dossier . '/' . $new_filename);
                    }
                }
                // error rename ficher
            } else {
                redirection(basename($_SERVER['PHP_SELF']) . '?file_id=' . $fichier['bt_id'] . '&errmsg=error_fichier_rename');
            }
        }
        list($fichier['bt_dim_w'], $fichier['bt_dim_h']) = getimagesize($dossier . '/' . $new_filename);
        // reupdate filesize.
        // modifie le fichier dans la BDD des fichiers.
        foreach ($GLOBALS['liste_fichiers'] as $key => $entry) {
            if ($entry['bt_id'] == $fichier['bt_id']) {
                $GLOBALS['liste_fichiers'][$key] = $fichier;
                // trouve la bonne entrée dans la base.
            }
        }
        $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id');
        file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */');
        // écrit dans le fichier, la liste
        redirection(basename($_SERVER['PHP_SELF']) . '?file_id=' . $fichier['bt_id'] . '&edit&msg=confirm_fichier_edit');
    } elseif ($quoi == 'supprimer-existant') {
        $id = $sup_var;
        // FIXME ajouter un test de vérification de session (security coin)
        foreach ($GLOBALS['liste_fichiers'] as $fid => $fich) {
            if ($id == $fich['bt_id']) {
                $tbl_id = $fid;
                break;
            }
        }
        // remove physical file on disk if it exists
        if (is_file($dossier . '/' . $fichier['bt_filename']) and isset($tbl_id)) {
            $liste_fichiers = rm_dots_dir(scandir($dossier));
            // liste les fichiers réels dans le dossier
            if (TRUE === unlink($dossier . '/' . $fichier['bt_filename'])) {
                // fichier physique effacé
                if ($fichier['bt_type'] == 'image') {
                    // supprimer aussi la miniature si elle existe.
                    @unlink(chemin_thb_img($dossier . '/' . $fichier['bt_filename']));
                    // supprime la thumbnail si y’a
                }
                unset($GLOBALS['liste_fichiers'][$tbl_id]);
                // efface le fichier dans la liste des fichiers.
                $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id');
                file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */');
                // enregistre la liste
                return 'success';
            } else {
                // erreur effacement fichier physique
                return 'error_suppr_file_suppr_error';
            }
        }
        // the file in DB does not exists on disk => remove entry from DB
        if (isset($tbl_id)) {
            unset($GLOBALS['liste_fichiers'][$tbl_id]);
            // remove entry from files-list.
        }
        $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id');
        file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */');
        // enregistre la liste
        return 'no_such_file_on_disk';
    }
}