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']))) . ' */'); }
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'; } }