Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gestionnaire de telechargement

11 réponses
Avatar
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é.

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

10 réponses

1 2
Avatar
Denis Beauregard
Le 18 Oct 2007 23:21:22 GMT, slambert
écrivait dans fr.comp.lang.php:

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


[...]

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

Avatar
Olivier Miakinen
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)

Avatar
Olivier Miakinen

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.

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

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().

Avatar
CrazyCat
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
Avatar
slambert
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....

readfile.


Je vais creuser.


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

Avatar
slambert
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 ?

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

Avatar
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.

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é.


Avatar
CrazyCat
Olivier Miakinen wrote:
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.


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

Avatar
slambert
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");
?>


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

Avatar
Olivier Miakinen

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");


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.

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.

1 2