Page 1 sur 1

AIDE : liste des 5 derniers fichiers uploadés

Posté : 17 sept. 2011, 12:59
par pauline17pr
Bonjour,

Actuellement, je suis sur un site pour ma classe.
J'explique le principe :
- Tout le monde peut envoyer les cours (fichiers) via un formulaire php sur mon site
- Les fichiers sont ainsi mis dans des dossiers selon leur contenu. Voici la liste des fichiers :

BTS >Info
>Eco
>Maths
>Algo
> ...

(juste un exemple)

Sur ma page index, j'aimerai lister les 5 derniers fichiers uploadés sur mon site (incluant donc les sous répertoires), pour que mes camarades soient directement au courant des nouveautés.

J'avais donc pensé à un code PHP qui listerai les fichiers du répertoire "BTS" incluant les sous répertoires .... mais selon la date d'envoi.

J'ai donc besoin de votre aide :)

Si vous avez besoin d'informations, demandez moi :)

C'est assez urgent, merci beaucoup :)

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 17 sept. 2011, 16:56
par sam12
Je propose 2 étapes:
- à la fin de l'upload, tu enregistres les infos du doc dans la bdd (nom, date, taille etc...)
- sur la page où tu veux récupérer les 5 derniers uploads, tu fais un :
SELECT * FROM "uploads" ORDER BY ID (ou date) DESC LIMIT 0 , 5

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 10:46
par Yosh
Je propose 2 étapes:
- à la fin de l'upload, tu enregistres les infos du doc dans la bdd (nom, date, taille etc...)
- sur la page où tu veux récupérer les 5 derniers uploads, tu fais un :
SELECT * FROM "uploads" ORDER BY ID (ou date) DESC LIMIT 0 , 5
C'est ce que j'aurais fait aussi.

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 16:54
par pauline17pr
Je ne fonctionne pas avec une base de données ici ... tout par php ... et tout est envoyé dans les dossiers du site :/

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 18:09
par moogli
salut,

pour ne travailler qu'avec les fichiers il est possible d'utiliser dir et les tableaux.

Le principe tu parcourt récursivement le répertoire qui t'intéresse et tu stock dans un un tableau les fichier et les dates de ceux ci.
exemple $file [ temps ] [] = $cheminDUfichier.
ainsi tu à par index avec le même temps tous les fichiers de la même date.

Après il est possible de trier le tableau selon les clefs ksort ou krsort et de ne prendre que les 5 derniers fichiers.
ce type de méthode étant assez lourde il est possible d'imaginer un système de cache avec un fichier plat.

attention le tri renomme les cléf c'est assez ennuyeux ^^ (donc a ne faire qu'a la fin)

@+

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 18:25
par sam12
salut,

pour ne travailler qu'avec les fichiers il est possible d'utiliser dir et les tableaux.

Le principe tu parcourt récursivement le répertoire qui t'intéresse et tu stock dans un un tableau les fichier et les dates de ceux ci.
exemple $file [ temps ] [] = $cheminDUfichier.
ainsi tu à par index avec le même temps tous les fichiers de la même date.

Après il est possible de trier le tableau selon les clefs ksort ou krsort et de ne prendre que les 5 derniers fichiers.
ce type de méthode étant assez lourde il est possible d'imaginer un système de cache avec un fichier plat.

attention le tri renomme les cléf c'est assez ennuyeux ^^ (donc a ne faire qu'a la fin)

@+
A vrai dire, j'allais proposer cette méthode mais les histoires de dossiers deviennent compliquées assez rapidement ;).

@pauline17pr: Comment ça se fait que tu n'es pas de bdd? Tous les hébergements web proposent au moins une bdd de nos jours.
Sinon tu as une autre solution, ça serait de tout stocker en .txt mais ca va être prise de tête pour trier tout ça.

A l'upload, tu écris dans le .txt le dernier upload (nom, taille etc...) et sur la page d'affichage, il faudra récupérer les 5 dernières lignes de ce .txt.

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 19:51
par moogli
A vrai dire, j'allais proposer cette méthode mais les histoires de dossiers deviennent compliquées assez rapidement ;).
les répertoires semble définit il "suffit" de parcourrir la chose et créer une "base" de ces fichiers et de les traiter php propose plein de chose pour cela et permet meme d'en créer au besoin :)
@pauline17pr: Comment ça se fait que tu n'es pas de bdd? Tous les hébergements web proposent au moins une bdd de nos jours.
l'utilisation d'une base de donnée n'est pas une obligation, peu être a t'elle de contrainte technique.
Je sais bien que php5 embarque SQLite et que c'est rapide et simple à mettre en place.

l'utilisation du fichier plat est une idée, reste à gérer le lock du fichier pour éviter les bêtises; le seul problème que j'y vois c'est de bien gérer la chose pour que le fichier ne prenne pas de bide trop rapidement (utilisation de file, et remplacement des fichiers par le haut, utilisation de array_unshift et array_slice pour remettre que 5 lignes dans le fichier systématiquement. Le problème c'est si l'on en souhaite plus, soit on garde un fichier gros et gras soit une base de donnée soit le parcourt des fichiers.

seule pauline17 pourra indiquer la solution qu'elle souhaite utiliser ;)

@+

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 20:10
par sam12
les répertoires semble définit il "suffit" de parcourrir la chose et créer une "base" de ces fichiers et de les traiter php propose plein de chose pour cela et permet meme d'en créer au besoin :)
Oui, tout à fait d'accord. Il "suffit" ;).
l'utilisation d'une base de donnée n'est pas une obligation, peu être a t'elle de contrainte technique.
Je sais bien que php5 embarque SQLite et que c'est rapide et simple à mettre en place.
On dirait un projet collectif pour sa classe, je ne pense pas qu'elle ait des contraintes mais je peux me tromper. Une bdd est un outil comme un autre et je trouve dommage de ne pas l'utiliser dans ce cas.

seule pauline17 pourra indiquer la solution qu'elle souhaite utiliser ;)
On attend sa réponse ;).

Re: AIDE : liste des 5 derniers fichiers uploadés

Posté : 19 sept. 2011, 20:59
par AB
Pour lister des fichiers de nos jours on peut regarder du côté de la lib spl http://www.php.net/manual/fr/class.dire ... erator.php.

Mais bon pour résoudre plus simplement ton pb, je partirais plutôt sur la dernière solution indiquée par moogli, à savoir enregistrer les fichiers dans un fichier texte "tout bête" lors de leur téléchargement. L'astuce pour que soit pratique et fiable est d'enregistrer un tableau sérialisé dans ton fichier texte.
De cette manière il suffit juste d'un "file_get_contents" suivi d'un "unserialize" pour récupérer ton tableau puis d'appliquer les fonctions "array_unshift" et "array_slice" indiquées par moogli pour construire et limiter ton tableau à un nombre précis. Et tu termine par un "serialize" et un "file_put_contents".
Travailler directement sur des lignes d'un fichier texte est moins fiable d'après mon expérience.

Bien entendu travailler avec une bdd serait plus évolutif (tris différents possibles, et sur tous les fichiers, etc.), mais s'il s'agit simplement d'afficher les derniers fichiers rentrés, la solution du fichier texte est tout à fait suffisante, d'autant que comme elle te prendra peu de temps à mettre en place, ce ne sera pas une perte de temps conséquente si tu envisages plus tard un changement de stratégie (et au passage tu auras appris la manipulation de fichiers texte).

Merci à tous :)

Posté : 20 sept. 2011, 13:17
par pauline17pr
Merci à tous pour votre aide.

Voilà le code que j'ai donc fait et qui fonctionne parfaite, sans base de données, qui va lire les sous dossiers, sous-sous dossier d'un dossier "fichiers" :)

A bientôt :)
<?php

$dossier = 'fichiers';

//Nombre de derniers
$n = 5;
function image_extension($extension)
{
switch ($extension)
{
case 'xls':
$icone = "xls.jpg";
break;
case 'pdf':
$icone = "pdf.jpg";
break;
case 'doc':
$icone = "word.jpg";
break;
default:
$icone = "uploads.jpg";
}
return $icone;
}

function scan_dossier($rep)
{
global $dir_objects;
$temp = opendir($rep);

while (false !== ($object = readdir($temp)))
   {
   if ($object != "." && $object != "..")
      {
   if (!is_dir($rep.'/'.$object))
      {
      $filename = $rep .'/'. $object;
      $file_object['time'] = filemtime($filename);
      $file_object['name'] = $object;
	  $file_object['ext'] = $extension=pathinfo($filename,PATHINFO_EXTENSION);
	  $file_object['img'] = image_extension($filename);
	  $file_object['lien'] = $filename;
      $dir_objects[] = $file_object;
      }
   elseif (is_dir($rep.'/'.$object))
      {
      scan_dossier($rep.'/'.$object);
      }
      }
   }
}

scan_dossier($dossier);

array_multisort($dir_objects, SORT_DESC);
array_splice($dir_objects,$n);
echo "\t\t<table><thead><tr><th></th><th></th><th></th></tr></thead>\n";
for($i=0;$i<count($dir_objects);$i++)
      {
	  echo "<tr><td><img src=\"".$dir_objects[$i]['img']."\" alt=\"".$dir_objects[$i]['ext']."\" /></td><td></td><td style=\"background-color: rgb(39, 44, 48); width: 650px;-\"><a href=\"".$dir_objects[$i]['lien']." \" target=\"_blank\">&nbsp;&nbsp;".$dir_objects[$i]['name']."</a> (Ajout&eacute; le ".date("d/m \&\a\g\\r\a\\v\e\; H:i", $dir_objects[$i]['time']).")</td></tr>";
      }
echo "\t\t</table>";
?>
Pauline
http://www.doc-informatiques.new.fr/