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

Enregistrer la cible d'un lien en imposant le nom du fichier

7 réponses
Avatar
cload
Bonjour =E0 tous,

J'ai un pb et je crois que s'il a une solution, ce doit =EAtre en=20
javascript (que je ma=EEtrise ... pas)

Dans un balise <a> mon href renvoi sur un programme php qui va ouvrir un =

fichier dans une base de donn=E9es et va la balancer =E0 l'op=E9rateur =
avec=20
les bons (j'esp=E8re) header.
Jusque l=E0 tout va bien et lorsque le fichier se pr=E9sente en=20
enregistrement, c'est bien le nom mis dans le header qui est propos=E9.

Le pb c'est lorsque je fais clic droit et Enregistrer la cible... L=E0, l=
e=20
nom qui est propos=E9 est le nom de mon programme php.

Je comprends bien la m=E9canique (je crois) mais n'y a-t-il pas moyen de =

faire que le nom propos=E9 en "enregistrer la cible" soit un nom autre qu=
e=20
le nom du href ?

7 réponses

Avatar
SAM
Le 9/24/09 5:47 PM, cload a écrit :
Bonjour à tous,

J'ai un pb et je crois que s'il a une solution, ce doit être en
javascript (que je maîtrise ... pas)

Dans un balise <a> mon href renvoi sur un programme php qui va ouvrir un
fichier dans une base de données et va la balancer à l'opérateur avec
les bons (j'espère) header.
Jusque là tout va bien et lorsque le fichier se présente en
enregistrement, c'est bien le nom mis dans le header qui est proposé.

Le pb c'est lorsque je fais clic droit et Enregistrer la cible... Là, le
nom qui est proposé est le nom de mon programme php.

Je comprends bien la mécanique (je crois) mais n'y a-t-il pas moyen de
faire que le nom proposé en "enregistrer la cible" soit un nom autre que
le nom du href ?



Ho! il m'est même arrivé de télécharger des pdf avec l'extension php.
On fait gaffe et on modifie l'extension, non ?

Ça fonctionne donc aussi bêtement que sur sourceforge.net (et autres)
où les boutons de download renvoient sur une page où, avec un peu de
patience, le téléchargement se lance tt seul.

Une fois qu'on s'est fait, par un clic-droit, piéger a charger un truc
php qui n'a rien à voir avec ce qu'attendu, on finit par être patient et
faire "normalement" ... :-(


--
sm
Avatar
Olivier Miakinen
Le 24/09/2009 17:47, cload a écrit :

J'ai un pb et je crois que s'il a une solution, ce doit être en
javascript (que je maîtrise ... pas)

Dans un balise <a> mon href renvoi sur un programme php qui va ouvrir un
fichier dans une base de données et va la balancer à l'opérateur avec
les bons (j'espère) header.



Quels sont les headers que tu mets ? Tu as un Content-Disposition avec
le bon nom de fichier ? Voir par exemple
<http://fr2.php.net/manual/fr/function.header.php#function.header.examples>;.

Jusque là tout va bien et lorsque le fichier se présente en
enregistrement, c'est bien le nom mis dans le header qui est proposé.

Le pb c'est lorsque je fais clic droit et Enregistrer la cible... Là, le
nom qui est proposé est le nom de mon programme php.

Je comprends bien la mécanique (je crois) mais n'y a-t-il pas moyen de
faire que le nom proposé en "enregistrer la cible" soit un nom autre que
le nom du href ?



Tu as une page où on peut voir ce comportement ? Et au passage, avec
quel(s) navigateur(s) as-tu essayé ?

Note que comme solution alternative (mais sympa) tu peux toujours
t'arranger pour que ton fichier PHP se présente avec un nom en .pdf !

--
Olivier Miakinen
Avatar
cload
Olivier Miakinen a écrit :

Dans un balise <a> mon href renvoie sur un programme php qui va ouvrir un
fichier dans une base de données et va la balancer à l'opérate ur avec
les bons (j'espère) header.



Quels sont les headers que tu mets ? Tu as un Content-Disposition avec
le bon nom de fichier ? Voir par exemple
<http://fr2.php.net/manual/fr/function.header.php#function.header.examp les>.



header("Content-disposition: inline; filename='$filename'");

SAM a écrit :
Ho! il m'est même arrivé de télécharger des pdf avec l'extensio n php.
On fait gaffe et on modifie l'extension, non ?



$filename est donné par un nom de fichier enregistré dans une base de
données. (Cette même base qui contient le fichier à télécharger .) Nom
que l'utilisateur veut récupérer (il a fait gaffe mais estime que c'e st
pas normal... et il n'a pas tort :p)

Enfin, lorsqu'on fait un clic droit, on n'envoie rien au serveur. Donc
on est toujours sur la page qui n'a pas de header. Le navigateur fait
simple : il parse le href pour avoir le nom qu'il propose en
enregistrement ; il se fout des headers (euh, c'est ce que je crois
avoir compris). D'où mon idée de lui imposer un nom mais comment
adresser cette "chose" ?

> Tu as une page où on peut voir ce comportement ? Et au passage, ave c
quel(s) navigateur(s) as-tu essayé ?


Firefox, ie, safari, seamonkey, opera
Sur seamonkey, c'est "Enregistrer le lien sous..."...

Note que comme solution alternative (mais sympa) tu peux toujours
t'arranger pour que ton fichier PHP se présente avec un nom en .pdf !


Sûr ! mais ce n'est pas le pb.
Avatar
Pascal
cload a écrit :
Le pb c'est lorsque je fais clic droit et Enregistrer la cible... Là, le
nom qui est proposé est le nom de mon programme php.



Bonjour,

J'ai un comportement équivalent, je crois, avec des documents PDF
composés dynamiquement.

La ressource appelée est aussi un script PHP, et le "fichier" résulta nt
est de type PDF.
Le Header envoyé est correct :
- Content-Disposition: inline; filename="doc.pdf"
- Content-Type: application/pdf
Si je demande l'enregistrement par le navigateur (par ex. "Fichier +
Enregistrer sous..." avec Firefox) le nom proposé est bien "doc.pdf".
Par contre, si je le demande par l'interface PDF, celui-ci compose un
nom exotique avec un préfixe "http__", le nom de domaine (sans "www" ni
".com") et l'extension ".pdf".

Je n'ai pas testé (parce que ce comportement ne me pose pas de pb dans
mon appli) mais je me demande si ça ne vient pas du choix de
"Content-Disposition". Il faudrait peut-être lui donner la valeur
"attachment" plutôt que "inline" (mais il ne s'ouvrira plus dans le
navigateur).

Par contre, je ne connais aucune manip javascript qui permettrait de
contrarier cela (à part une magouille exclusive MSIE si la ressource
générée vient de la même boutique, genre Word ou Excel).

Sinon, reste la solution de demander au script PHP d'enregistrer la
ressource résultante dans un fichier réel sur le serveur, avec le nom
idoine, puis de déclencher le téléchargement de ce fichier. Là il aura
forcément le nom attendu.

Cordialement,
Pascal
Avatar
Olivier Miakinen
Le 25/09/2009 09:20, cload m'a répondu :

Tu as une page où on peut voir ce comportement ?





Tu n'avais pas répondu à ça, alors j'en ai fait une :
<http://www.miakinen.net/tmp/cload/>;.

Note que comme solution alternative (mais sympa) tu peux toujours
t'arranger pour que ton fichier PHP se présente avec un nom en .pdf !


Sûr ! mais ce n'est pas le pb.



Bien sûr que si, c'est le problème ! Ou en tout cas c'est la solution.
Dans le répertoire cload, en plus du fichier index.php j'ai mis trois
autres fichiers :

1) hello.txt est un fichier texte qui contient :
-----------------------------------------------------
Hello, world!
-----------------------------------------------------

2) salut.php est un script PHP qui contient :
-----------------------------------------------------
<?
header('Content-Type: text/plain; charset="us-ascii"');
header('Content-Disposition: attachment; filename="coucou.txt"');
readfile('hello.txt');
?>
-----------------------------------------------------

3) bonjour.txt.php est un script PHP identique à salut.php.


Comme j'ai « Options +MultiViews » dans mon .htaccess, je n'ai pas
besoin de préciser l'extension dans la requête HTTP. Par exemple, les
deux URL suivantes pointent vers le même fichier texte :
<http://www.miakinen.net/tmp/cload/hello.txt>;
<http://www.miakinen.net/tmp/cload/hello>;
Idem pour les trois suivantes qui pointent vers le même script PHP :
<http://www.miakinen.net/tmp/cload/bonjour.txt.php>;
<http://www.miakinen.net/tmp/cload/bonjour.txt>;
<http://www.miakinen.net/tmp/cload/bonjour>;

Comme tu le vois, le lien « bonjour.txt » (qui est un script PHP) est
parfait, car tu peux cliquer dessus et il te propose d'enregistrer
coucou.txt, mais tu peux aussi bien faire « enregistrer le lien sous »
auquel cas il te propose le nom bonjour.txt. Bien entendu, tu peux faire
en sorte que le nom soit le même dans les deux cas.

Note que malheureusement les liens de type « salut?salut.txt » ne
marchent pas : il s'occupe de ce qui précède le « ? » indépendamment
de ce qui le suit.
Avatar
cload
Pascal a écrit :
cload a écrit :
Le pb c'est lorsque je fais clic droit et Enregistrer la cible... Là ,
le nom qui est proposé est le nom de mon programme php.



Bonjour,

J'ai un comportement équivalent, je crois, avec des documents PDF
composés dynamiquement.

La ressource appelée est aussi un script PHP, et le "fichier" résul tant
est de type PDF.
Le Header envoyé est correct :
- Content-Disposition: inline; filename="doc.pdf"
- Content-Type: application/pdf
Si je demande l'enregistrement par le navigateur (par ex. "Fichier +
Enregistrer sous..." avec Firefox) le nom proposé est bien "doc.pdf".
Par contre, si je le demande par l'interface PDF, celui-ci compose un
nom exotique avec un préfixe "http__", le nom de domaine (sans "www" ni
".com") et l'extension ".pdf".

Je n'ai pas testé (parce que ce comportement ne me pose pas de pb dan s
mon appli) mais je me demande si ça ne vient pas du choix de
"Content-Disposition". Il faudrait peut-être lui donner la valeur
"attachment" plutôt que "inline" (mais il ne s'ouvrira plus dans le
navigateur).



Ce qui est exclu
Par contre, je ne connais aucune manip javascript qui permettrait de
contrarier cela (à part une magouille exclusive MSIE si la ressource
générée vient de la même boutique, genre Word ou Excel).

Sinon, reste la solution de demander au script PHP d'enregistrer la
ressource résultante dans un fichier réel sur le serveur, avec le n om
idoine, puis de déclencher le téléchargement de ce fichier. Là il aura
forcément le nom attendu.


Oui, mais là, ce n'est plus la même application
Merci Pascal
Avatar
cload
Olivier Miakinen a écrit :
Le 25/09/2009 09:20, cload m'a répondu :
Tu as une page où on peut voir ce comportement ?






euh, j'avais zappé mais c'était : non, extranet privé sécure etc.


Tu n'avais pas répondu à ça, alors j'en ai fait une :
<http://www.miakinen.net/tmp/cload/>;.

Note que comme solution alternative (mais sympa) tu peux toujours
t'arranger pour que ton fichier PHP se présente avec un nom en .pdf !


Sûr ! mais ce n'est pas le pb.



Bien sûr que si, c'est le problème ! Ou en tout cas c'est la soluti on.
Dans le répertoire cload, en plus du fichier index.php j'ai mis trois
autres fichiers :

1) hello.txt est un fichier texte qui contient :
-----------------------------------------------------
Hello, world!
-----------------------------------------------------

2) salut.php est un script PHP qui contient :
-----------------------------------------------------
<?
header('Content-Type: text/plain; charset="us-ascii"');
header('Content-Disposition: attachment; filename="coucou.txt"');
readfile('hello.txt');
?>
-----------------------------------------------------

3) bonjour.txt.php est un script PHP identique à salut.php.


Comme j'ai « Options +MultiViews » dans mon .htaccess, je n'ai pas
besoin de préciser l'extension dans la requête HTTP. Par exemple, l es
deux URL suivantes pointent vers le même fichier texte :
<http://www.miakinen.net/tmp/cload/hello.txt>;
<http://www.miakinen.net/tmp/cload/hello>;
Idem pour les trois suivantes qui pointent vers le même script PHP :
<http://www.miakinen.net/tmp/cload/bonjour.txt.php>;
<http://www.miakinen.net/tmp/cload/bonjour.txt>;
<http://www.miakinen.net/tmp/cload/bonjour>;

Comme tu le vois, le lien « bonjour.txt » (qui est un script PHP) e st
parfait, car tu peux cliquer dessus et il te propose d'enregistrer
coucou.txt, mais tu peux aussi bien faire « enregistrer le lien sous »
auquel cas il te propose le nom bonjour.txt. Bien entendu, tu peux fair e
en sorte que le nom soit le même dans les deux cas.

Note que malheureusement les liens de type « salut?salut.txt » ne
marchent pas : il s'occupe de ce qui précède le « ? » indépen damment
de ce qui le suit.



Je suis impressionné. Merci beaucoup pour ce travail énorme qui
m'éclaire pas mal. Et en effet, je n'avais pas vu où tu voulais en ve nir.

Ce que j'apprends d'important c'est que les header du fichier php lié
sont lus et pris en compte.
Par contre, comme je suis dans du dynamique, mes header ne contiennent
qu'un nom de variable, que seule une exécution d'une grande partie de l a
source va initialiser. Ce qui n'est pas le cas, mais à partir de ton
exemple, je fais me faire une batterie de test pour meiux comprendre.
De plus, j'utilise le Content-Disposition: inline et non
Content-Disposition: attachment (dont je ne prétendrais pas avoir
parfaitement maîtrisé la subtile différence).
Alors cela m'a donné une idée que je vais tester et je te tiendrais a u
courant.
Merci encore en tout cas.
Cload