Discussion:
Gestionnaire de telechargement
(trop ancien pour répondre)
slambert
2007-10-18 23:21:22 UTC
Permalink
Salut tous :)

J'ai besoin de réfléchir à la conception d'un système de téléchargement.

Exemple : un site de gestion de contenu va proposer à l'internaute de
pouvoir, après sélection et moteur de recherche, le téléchargement d'un
fichier (pdf, mpg, etc...).... Problème, il ne faut pas donner l'url
directe, il faut proposer une url temporaire valable par exemple 15 minutes,
ce qui signifie l'appel d'un script avec des paramètres, ce script envoyant
le fichier en réponse ou redirigeant sur une page d'expiration de
"session"....

Je suppose que de faire un fopen sur le fichier pour ensuite l'envoyer au
navigateur ligne par ligne est super gourmand en ressource et pas forcément
optimisé.

Dans ce cas de figure, que j'ai déjà vu sur le web : comment on fait, en
gros ? Il y a très certainement des méthodes principales et une logique
générales...

Quelqu'un a déjà travaillé sur un système du genre, ou y a déjà réfléchis ?

Merci d'avance

@++

Stef
Denis Beauregard
2007-10-19 07:27:22 UTC
Permalink
Post by slambert
J'ai besoin de réfléchir à la conception d'un système de téléchargement.
[...]
Post by slambert
Quelqu'un a déjà travaillé sur un système du genre, ou y a déjà réfléchis ?
Je suis en train de réfléchir à un système similaire. Dans mon cas,
il s'agit de bulletins anciens d'une revue livrés sous forme de pdf.

Ce que je ferais, c'est de créer un fichier, disons

20071018-4125-no-1.pdf où

20071018 est la date
4125 est un numéro aléatoire
no-1 est le nom du fichier



Le tout précédé d'une commande comme

system ("cp ../secretGhjiNV/no-1.pdf 20071018-4125-no-1.pdf");

avec un

system ("rm 20071018-4125-no-1.pdf");

envoyé une heure plus tard via un "crontab", soit via un
fichier 20071018-15.php avec la liste des fichiers à effacer pour
l'heure (15:00 ici).


Evidemment, s'il y a une méthode plus simple, je suis preneur ;-)


Denis
Olivier Miakinen
2007-10-19 08:02:33 UTC
Permalink
Post by Denis Beauregard
Ce que je ferais, c'est de créer un fichier, disons
20071018-4125-no-1.pdf où
20071018 est la date
4125 est un numéro aléatoire
no-1 est le nom du fichier
Ça me semble bien. À condition de ne pas recopier le fichier inutilement.
Post by Denis Beauregard
Le tout précédé d'une commande comme
system ("cp ../secretGhjiNV/no-1.pdf 20071018-4125-no-1.pdf");
Puisque tu copies avec cp, je suppose que le serveur est un Unix ou
équivalent. Il vaudrait mieux faire un « ln » ou « ln -s », ce qui peut
se faire directement sans appel à system() :
http://fr2.php.net/manual/fr/function.link.php
http://fr2.php.net/manual/fr/function.symlink.php
Post by Denis Beauregard
avec un
system ("rm 20071018-4125-no-1.pdf");
http://fr2.php.net/manual/fr/function.unlink.php

Note que, contrairement à ce que son nom peut laisser supposer, l'appel
système unlink() et la fonction PHP de même nom peuvent servir à effacer
des fichiers copiés par cp ou créés de quelque manière que ce soit : ce
n'est pas réservé aux liens créés par link() et symlink() !

En fait, la commande rm fait un unlink().
CrazyCat
2007-10-19 10:17:06 UTC
Permalink
A cela j'ajouterais qu'il est inutile de s'embéter acec un cron alors
que de fonctions comme filemtime permettent de savoir quand le fichier a
été créé (modifié) et donc de le supprimer si le temps est écoulé.
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
Réseau IRC Francophone: http://www.crazy-irc.net
slambert
2007-10-19 10:17:06 UTC
Permalink
Post by Denis Beauregard
Ce que je ferais, c'est de créer un fichier, disons
20071018-4125-no-1.pdf où
Donc en fait tu crées un fichier par lien de telechargement à gerer ?
Post by Denis Beauregard
system ("cp ../secretGhjiNV/no-1.pdf 20071018-4125-no-1.pdf");
Passons sur le fait que tu as accès au Cron, alors que je vais etre en
mutualisé.... Au pire un script peut aller efffacer les fichiers dont le
nom est d'un certain type par rapport à la date du jour.

C'est clair que tu n'as pas à traiter tes telechargement via un script, ca
va economiser des ressources. Mais ca fait quand meme pas mal de fichiers,
si le truc monte en volume ca va exploser, sauf si tu fais des liens
symboliques :) De plus, ca sera moins evident pour faire des stats par
fichiers, par user, etc.... Et tu n'es pas sur que c'est bien la bonne
personne qui va venir telecharger, vu que n'importe qui pourra downloader
sans passer par la verification de Session.......

A voir, à voir....

En tout cas, je préfère me poser mes ces questions avant de commencer, c'est
plus sain :)

Stef
Olivier Miakinen
2007-10-19 07:27:22 UTC
Permalink
Post by slambert
Salut tous :)
J'ai besoin de réfléchir à la conception d'un système de téléchargement.
Exemple : un site de gestion de contenu va proposer à l'internaute de
pouvoir, après sélection et moteur de recherche, le téléchargement d'un
fichier (pdf, mpg, etc...).... Problème, il ne faut pas donner l'url
directe, il faut proposer une url temporaire valable par exemple 15 minutes,
ce qui signifie l'appel d'un script avec des paramètres, ce script envoyant
le fichier en réponse ou redirigeant sur une page d'expiration de
"session"....
Je suppose que de faire un fopen sur le fichier pour ensuite l'envoyer au
navigateur ligne par ligne est super gourmand en ressource et pas forcément
optimisé.
Bof... pourquoi pas ? Pas un fopen, mais un readfile. Il faudrait faire
des mesures pour voir si c'est vraiment si gourmand en ressources.

Mais sinon, tu peux toujours faire un lien symbolique que tu n'effaceras
qu'au bout des 15 minutes.
http://fr.php.net/manual/fr/function.symlink.php
(ne fonctionne que sur Unix)
slambert
2007-10-19 10:17:06 UTC
Permalink
Post by Olivier Miakinen
Bof... pourquoi pas ?
Parceque tu le traites ligne par ligne ? Il faudrait ue je teste avec un
include, directement. C'est bourrin, mais est ce que ca marcherait....
Post by Olivier Miakinen
readfile.
Je vais creuser.
Post by Olivier Miakinen
Mais sinon, tu peux toujours faire un lien symbolique que tu n'effaceras
qu'au bout des 15 minutes.
http://fr.php.net/manual/fr/function.symlink.php
(ne fonctionne que sur Unix)
La bonne blague, c'est que je suis sur un mutualisé. :)

Stef
Olivier Miakinen
2007-10-19 10:43:13 UTC
Permalink
Post by slambert
Post by Olivier Miakinen
Bof... pourquoi pas ?
Parceque tu le traites ligne par ligne ?
Non, il ne faut surtout pas le faire ligne par ligne !

Le code doit se résumer à quelque chose comme ça, aux inévitables
vérifications près (je donne l'exemple pour un JPEG) :

<?php
header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=\"toto.jpg\"");
readfile("/truc/bidule/toto.jpg");
?>

Cela dit, un lien (symbolique ou non) serait probablement préférable.
Post by slambert
Post by Olivier Miakinen
Mais sinon, tu peux toujours faire un lien symbolique que tu n'effaceras
qu'au bout des 15 minutes.
http://fr.php.net/manual/fr/function.symlink.php
(ne fonctionne que sur Unix)
La bonne blague, c'est que je suis sur un mutualisé. :)
Et alors ? Chez Galacsys, j'ai demandé un jour à ce qu'on me crée un
lien symbolique vers un répertoire parce que je ne pouvais pas le faire
par FTP : ils ont eu la gentillesse de le faire, mais en précisant que
j'aurais parfaitement pu le faire moi-même par PHP, alors même que
c'était en dehors de l'arborescence web (mais dans mes répertoires,
bien sûr).

Donc : commence par essayer, et seulement si ça ne marche pas demande à
ton FSI s'ils ne pourraient pas débrider cette fonctionnalité.
CrazyCat
2007-10-19 12:37:49 UTC
Permalink
Post by Olivier Miakinen
Le code doit se résumer à quelque chose comme ça, aux inévitables
<?php
header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=\"toto.jpg\"");
readfile("/truc/bidule/toto.jpg");
?>
Cela dit, un lien (symbolique ou non) serait probablement préférable.
et pourquoi pas juste (après les inévitables contrôles de validité):
header("Content-Disposition: inline; filename=\"nomALC.jpg\"");
readfile("/truc/bidule/toto.jpg");

L'utilisateur ne voit pas la source réelle et télécharge nomALC.jpg
Il suffit d'avoir un .htaccess par exemple qui permette de faire la
relation entre un nomALC et un utilisateur et/ou timestamp.
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
Réseau IRC Francophone: http://www.crazy-irc.net
Olivier Miakinen
2007-10-19 15:50:32 UTC
Permalink
Post by CrazyCat
header("Content-Disposition: inline; filename=\"nomALC.jpg\"");
readfile("/truc/bidule/toto.jpg");
C'est possible, bien sûr. Mais vu que ce nom de fichier ne sert que de
nom par défaut au cas où le visiteur voudrait le sauver sur son disque
dur, je ne vois pas pourquoi on irait lui coller un nom À L. C.. au lieu
du nom qui a une signification.

J'ai supposé bien sûr que /truc/bidule était dans une partie de l'arbo-
rescence inaccessible directement en HTTP.
Post by CrazyCat
L'utilisateur ne voit pas la source réelle et télécharge nomALC.jpg
Il suffit d'avoir un .htaccess par exemple qui permette de faire la
relation entre un nomALC et un utilisateur et/ou timestamp.
Ah, j'ai l'impression que tu confonds le nom passé dans l'entête
Content-Disposition et celui utilisé pour accéder au script.
N'est-ce pas exact ?

Reprenons.

1. On file à l'utilisateur l'URL suivante :
http://www.example.com/chemin/script.php?param=nomÀLCaléatoire

2. Le script script.php déduit de nomÀLCaléatoire (par une lecture en
base de données) qu'il doit chercher /chemin/privé/CrazyCat.jpg

3. Il le renvoie via readfile() après avoir indiqué que c'était un
fichier JPEG de nom CrazyCat.jpg

Et bien entendu, le visiteur ne pourra jamais lire directement un
quelconque fichier CrazyCat.jpg sous http://www.example.com


--- Mais encore une fois le lien symbolique serait mille fois plus
simple que tout ça. En plus on n'a pas besoin de s'embêter avec les
paramètres de cache, par exemple.
slambert
2007-10-19 15:50:32 UTC
Permalink
Post by CrazyCat
header("Content-Disposition: inline; filename=\"nomALC.jpg\"");
readfile("/truc/bidule/toto.jpg");
L'utilisateur ne voit pas la source réelle et télécharge nomALC.jpg
Il suffit d'avoir un .htaccess par exemple qui permette de faire la
relation entre un nomALC et un utilisateur et/ou timestamp.
Ceci est à tester aussi si les liens symboliques ne sont pas autorisés, car
cela oblige a sauvegarder quelque part la date de départ de session pour ce
fichier et ce user.

Merci pour l'idée :)

@++

Stef

slambert
2007-10-19 12:37:49 UTC
Permalink
Post by Olivier Miakinen
Le code doit se résumer à quelque chose comme ça, aux inévitables
<?php
header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=\"toto.jpg\"");
readfile("/truc/bidule/toto.jpg");
?>
Avec la création d'un lien symbolique vers le fichier à télécharger. Et un
test avec filemtime (merci CrazyCat :) qui supprime le lien et redirige
vers la page de fin de session si le temps alloué est expiré. En plus je
commence à voir la structuration de mes objets.

Clairement, oui, ca peut le faire.

Va falloir que je fasse quelques tests, je vais encore avoir un bon We de
détente, je le sens venir de loin celui là :)

Merci les gars

@++

Stef
Continuer la lecture sur narkive:
Loading...