1.
J'ai sur mon site des fichiers PDF en téléchargement sur des serveurs distants. Le site répertorie ces fichiers selon le cours auquel ceux-ci appartiennent. J'ai donc une page qui m'affiche tous les fichier PDF d'un cours.
Prenons un exemple :
4ème Année - Anglais L2 (URL Rewriting pour le .html
Sur cette page, j'affiche les fichiers PDF du cours d'Anglais 4ème ... J'ai donc établi une boucle qui prend tous les PDF qui pour correspondance "1" dans la colonne "cours" de ma base de donnée.
Maintenant vient le problème de l'affichage de la taille des fichiers en question. J'ai par ailleur utilisé le système pour vérifier l'existence du fichier en question 8) . D'une pierre deux coups ...
Sachant que à chaque retour de boucle, une nouvelle connexion ftp est ouverte ... ce qui bouffe de la bande passante et occupe bien le serveur central.
Voici le code :
mysql_connect($dbhost, $dbuser, $dbpasswd) or die('Erreur de connexion');
mysql_select_db($dbname) or die('Base inexistante');
$sql5 = "SELECT * FROM NomFichiers WHERE cours = $id ORDER BY `titre` ASC";
$query5 = mysql_query($sql) or die( 'Erreur' );
$sql6 = 'SELECT * FROM NomServeurs WHERE cours = '.$id.'';
$query6 = mysql_query($sql6) or die('Erreur');
$lesserveurs = mysql_fetch_array($query6);
mysql_close();
while ( $tableau = mysql_fetch_array( $query5 ) ) { // On démarre la boucle et on extrait les données de la BDD
if ($tableau['bip'] == 1) { // Si le fichier est situé sur le serveur central (Exception renseignée par la BDD)
$file3 = $tableau['dossier'];
$file = "../fichiers/$file3"; // Où "$file" est le chemin relatif à l'url du serveur central
if(file_exists($file)) { // Si le fichier sur le serveur central existe bien
$taille = filesize($file) / 1048576; // On calcul en octets et on divise pour avoir en Mo
$taille_screen = number_format($taille, 2, ',', ' '); // On limite le nombre de décimale
$taillepr = "$taille_screen Mo"; // On charge la varibale d'affichage
}
} else { // Si le fichier est sur un serveur distant
$ftp_server = $lesserveurs['ftp']; // On charge les variables renseignées par la table (NomServeurs)
$ftp_user = $lesserveurs['user'];
$ftp_pass = $lesserveurs['password'];
$file = $tableau['dossier']; // On charge le chemin relatif à l'url du serveur distant
$conn_id = ftp_connect($ftp_server) or die("Impossible de se Connecter au Serveur \"$ftp_server\""); // On se connecte au FTP
if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) { // On s'identifie et si OK :
$res = ftp_size($conn_id, $file); // On tente de calculer la taille de fichier
if ($res != -1) { // Si OK
$taille = $res / 1048576; // On transforme en Mo
$taille_screen = number_format($taille, 2, ',', ' '); // On limite le nombre de décimale
$taillepr = "$taille_screen Mo"; // On charge la varibale d'affichage
} else { // Si fichier inexistant ou impossible de calculer la taille
$taillepr = "Serveur Indisponible"; // On considère alors le fichier comme inexistant
}
} else { // Si serveur injoignable
$taillepr = "Connexion Impossible au Serveur Impossible";
}
ftp_close($conn_id); // On ferme la connexion FTP
}
echo '<a name="'.$tableau['id'].'"><table border="0" cellspacing="0" cellpadding="5">';
echo '<tr>';
echo '<td><img border="1" src="http://site4dcours.jexiste.be/apercus/'.$tableau['apercu'].'" alt="'.$tableau['titre'].' - '.$tableau['soustitre'].'"></td>';
echo '<td valign="middle"><p><span class="Style2">'.$tableau['titre'].' - '.$tableau['soustitre'].'<br>'.$taillepr.' - '.$tableau['pages'].' Page';
if ($tableau['pages'] > 1) { echo "s"; }
echo "<br>Ce fichier a";
if ($tableau['compteur'] > 12) { echo " déjà"; }
echo " été téléchargé ";
echo $tableau['compteur'];
echo " fois";
echo '<br><br><INPUT TYPE=button VALUE="Détails ..." onClick="document.location.href=\'http://site4dcours.jexiste.be/pdf-'.$tableau['id'].'.html\'">';
echo '</span></p></td></tr>';
echo '</table></a>';
}
Ma question se pose donc : Comment optimiser tout ça ? 2.
Pour le téléchargement de ces memes fichier ... J'ai établie un code qui renvoie le fichier PDF distant sous un autre nom que l'original ... Le problème c'est que des Caractères comme "&", ":" peuvent intervenir dans le nouveau nom de ces fichiers ...
Voici le code :
<?php
mysql_connect($dbhost, $dbuser, $dbpasswd) or die('Erreur de connexion'); // Connexion à MySQL
mysql_select_db($dbname) or die('Base inexistante'); // Chargement de la BDD
$sql = "SELECT * FROM `NomFichiers` WHERE `id` = $id"; // Chargement des informations sur le fichier
$requete = mysql_query($sql) or die('Erreur'); // On exectute la requete
$details = mysql_fetch_array($requete); // On garde les valeurs dans un tableau
$ancienne = $details['compteur']; // Recupération de la Valeur du Compteur du Fichier
++$ancienne; // Pré-incrémentation de la valeur du compteur
$compteuradd = "UPDATE `NomFichiers` SET `compteur` = '$ancienne' WHERE `id` = $id"; // On enregistre la nouvelle valeur du compteur
mysql_query($compteuradd) or die('Erreur'); // On exectute la requete
$sql5 = 'SELECT * FROM NomServeurs WHERE cours = '.$details['cours'].''; // On choisi le serveur correspondant au "cours" du fichier en question
$query5 = mysql_query($sql5) or die('Erreur'); // On exectute la requete
$lesserveurs = mysql_fetch_array($query5); // On garde les valeurs dans un tableau
mysql_close(); // On ferme la connexion MySQL
$titrepdf = $details['titre']; // Charge le Titre contenu dans la BDD
$soustitrepdf = $details['soustitre']; // Charge le Sous-Titre contenu dans la BDD
if ($details['bip'] == 1) { // Si fichier en local
$file3 = $details['dossier'];
$pdf = "http://site4dcours.jexiste.be/fichiers/$file3"; // On génere l'URL complete du fichier local
} else { // Si fichier distant
$urlserveur = $lesserveurs['http']; // On récupere l'adresse du Serveur distant
$urlfichier = $details['dossier']; // On récupère le chemin du fichier sur le serveur distant
$pdf = "$urlserveur$urlfichier"; // On génere l'URL complete du fichier distant
}
header('Content-type: application/pdf'); // On envoie le "header"
header('Content-Disposition: attachment; filename="'.$titrepdf.' - '.$soustitrepdf.'.pdf"'); // On renome le fichier
readfile($pdf); // On lance le téléchargement/lecture du PDF
?>
Et la deuxième question : Comment remplacer les caractères spéciaux qui pourraient encombrer le titre avec des caractères genre "_" ou "-" ?Merci de votre lecture et de votre aide. Et si vous voyez des chose que je pourrais améliorer niveau optimisation du code, c'est le bienvenu !!!
Encore merci d'avance