8722 sujets

Développement web côté serveur, CMS

Bonjour,
J'ai intégré du code HTML dans une page d'un site créé avec Adobe MUSE pour permettre aux visiteurs de télécharger (je ne veux pas qu'ils l'ouvrent) un document PDF (un bon de commande), ce code fonctionne plus ou moins mais dans la plupart des navigateurs il s'ouvre quand même. Quelqu'un a-t-il une solution pour empecher cela.
Merci d'avance.
LBOLUX
Voici le code :
<a href="http://luxfoodexpress.lu/Bondecommande/BondecommandeLFE.pdf" download="Bondecommande.pdf"><p style="color:#42B304;font-family:Century Gothic;font-size:16px">Téléchargé ici le Bon de commande</p></a>
Pour autant que je sache, l'attribut download n'est toujours pas supporté par l'ensemble des navigateurs récents. Il te faudra trouver une autre solution en attendant.

Par contre, je te suggère vivement de changer le titre de ton sujet de Adobe Muse à par exemple, <a> attribut download.
Merci à Thierry pour sa réponse, pour l'instant cela ne m'arrange pas trop.
Par contre,nouveau sur le forum, je ne sais pas changer le titre du sujet et d'autre part j'aimerai que cela reste quand même lié à Adobe Muse puisque c'est la raion de ma question.
Modérateur
Bonjour,

LBOLUX a écrit :
Merci également à blackiyto mais y-a-t'il une solution alternative ?


1) blackiyto est un compte de spammer qui reprend un morceau des réponses précédentes.

2) pour le téléchargement des fichiers, c'est a priori l'utilisateur qui décide ce qu'il veut faire : soit les ouvrir dans le navigateur directement, soit les enregistrer dans un dossier. Ça se configure dans les navigateurs client ! Tu n'as pas la main là-dessus, et en plus, tu énerverais pas mal de gens si tu leur forçais la main en leur imposant une méthode particulière. Note aussi que sur certaines machines, il n'y a tout simplement pas de dossiers accessibles à l'utilisateur.

3) Tu es peut-être dans un contexte particulier, comme un intranet où tous les utilisateurs et leurs matériels sont connus. Les solutions dépendent de ce contexte.

Amicalement,
Modérateur
Bonjour,

Pour ce qui est des solutions alternatives, y en a plein. Tu peux par exemple tenter la méthode suivante (je ne sais pas si ça peut fonctionner facilement dans un contexte Adobe-Muse que je ne connais pas, il faut qu'il y ait possibilité de faire du php) :

1) Code html à insérer dans la page de download (j'ai remplacé la balise <p> par un <span> qui convient mieux ici en théorie) :

<a href='downloadBondecommande.php'><span style="color:#42B304;font-family:Century Gothic;font-size:16px">Téléchargé ici le Bon de commande</span></a>

Il faudra sans doute ajouter un chemin devant downloadBondecommande.php.

2) Le code php à mettre dans le fichier downloadBondecommande.php

<?php
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename='Bondecommande.pdf'");
readfile("/Bondecommande/BondecommandeLFE.pdf"); // adapter le chemin éventuellement
?>


Amicalement,
Modifié par parsimonhi (28 Dec 2018 - 13:51)
Merci à parsimonhi pour cette réponse, je vais tester ce code dès que j’aurai trouvé comment l’insérer dans la conception d’un site créé avec Adobe Muse (j’ai une piste que je dois explorer).
Petite explication pour clarifier cette demande :
J’ai ressorti d’un tiroir, où elles étaient bien enfouies, mes quelques anciennes connaissances de création de site pour rendre service à ma petite-fille, élève d’une classe de seconde commerce qui, avec quelques condisciples, doit créer et gérer pendant l’année scolaire une mini-entreprise (vente de produits locaux frais pour élaborer des recettes de cuisine). Le site s’adresse donc à des ménagères n’ayant en général que peu, ou pas de connaissances dans l’utilisation d’ordinateur, c’est pourquoi j’essaie de simplifier les choses en faisant télécharger, enregistrer, compléter et renvoyer par Email un bon de commande en PDF.
J’espère ne pas avoir pollué ni encombrer inutilement ce forum.
Merci à tous ceux qui me liront.
Bonjour,
Ceci est à l'attention de parsimonhi :
J'ai testé le code fourni qui fonctionne correctement, mais il reste un problème que je n'arrive pas à résoudre : le nom du fichier enregistré est entouré de simple quote c.a.d. 'BondecommandeLFE.PDF' ce quifait qu'il n'est pas reconnu et qu'il faut enlever les simples quotes pour pouvoir l'ouvrir.
Merci d'avance à celui ou à ceux qui pourront m'aider.
Une fois que le fichier a été téléchargé et enregitré dans l'ordinateur. Le fichier lui-même une fois renommé (sans les simples quotes l'entourant) est un fichier PDF normal.
Merci encore de votre patience.
Modérateur
Bonjour,

LBOLUX a écrit :
Une fois que le fichier a été téléchargé et enregitré dans l'ordinateur. Le fichier lui-même une fois renommé (sans les simples quotes l'entourant) est un fichier PDF normal.
Merci encore de votre patience.
En déduisez-vous qu'il faille demander à chaque utilisateur de reproduire cette démarche pour obtenir un fichier conforme ?

Selon moi le problème provient de cette ligne de Parsimonhi:
header("Content-Disposition:attachment;filename='Bondecommande.pdf'");
dont le nom de fichier ne devrait pas être enclavé par des guillemets simples.

Mais surtout, ne lui jetez pas la pierre ; ça arrive... même aux meilleurs, la preuve !
Modérateur
Bonjour,
Greg_Lumiere a écrit :

Selon moi le problème provient de cette ligne de Parsimonhi:
header("Content-Disposition:attachment;filename='Bondecommande.pdf'");
dont le nom de fichier ne devrait pas être enclavé par des guillemets simples.

Mais surtout, ne lui jetez pas la pierre ; ça arrive... même aux meilleurs, la preuve !

Bien vu, et merci pour le compliment ! Smiley cligne

Reste que cette affaire a l'air de dépendre du système de l'ordinateur du client : ça marche avec des simples quotes chez moi sans problème, que ce soit avec MacOS ou Windows 10.

Quelqu'un aurait une explication ?

Amicalement,
Merci à tous ceux, et surtout parsimonhi et Greg_Lumiere, pour leur aide efficace. Effectivement cela marche chez moi sans les simples quotes. Il ne me serait certainement pas venu à l'idée de jeter la pierre à qui que ce soit, ni maintenant ou mes connaisance s'estompent de plus en plus ni même il y a des années quand j'avais encore quelques compétences en la matière.
Etant aujourd'hui dépassé je ne vais être d'aucune utilité dans la suite des recherches et je vais, pour ce qui me concerne clôturé le sujet, d'autant plus que je dois maintenant résoudre un autre problème avec ce PDF, à savoir son utilisation dans des environnements très différents (cas clients).
Merci encore et toute ma reconnaissance et mon amitié à tous les professionnels qui se donennt tant de mal pour aider les autres. Smiley smile Smiley smile Smiley smile
Modérateur
parsimonhi a écrit :

Reste que cette affaire a l'air de dépendre du système de l'ordinateur du client : ça marche avec des simples quotes chez moi sans problème, que ce soit avec MacOS ou Windows 10.

Quelqu'un aurait une explication ?
Je n'ai pas d'explication formelle qui explique par A + B le pourquoi du comment.
Ma surprise est plus du fait que chez vous, Parsimonhi, cela fonctionne alors que théoriquement vous devriez obtenir le même résultat que Lbolux.

En fait je doute que la distinction soit faite à ce niveau par l'OS ou le navigateur. Je doute même que le soucis se situe du côté du client.

Mais j'ai une hypothèse sur la question. En effet, la documentation PHP indique que la fonction header attend un string comme paramètre à la fonction.
Tout comme moi vous savez qu'un string enclavé par des guillemets double indique au parser que le contenu est susceptible de contenir une (ou des) variable qu'il faudra remplacer par leur valeur. Ceci à l'inverse d'une enclave par des guillemets simples qui indique qu'il faudra interpréter le contenu tel quel.

Toutefois dans le cas où une chaine de caractère est enclavée de guillemets doubles, la seule précaution prise par le parser en ce qui concerne l'interprétation de guillemet simple est de l'échapper afin qu'il soit retransmit fidèlement, c'est-à-dire en tant qu'apostrophe.

A ce stade on peut en déduire que le parser PHP interprètera toujours la chaîne "Content-Disposition:attachment;filename='Bondecommande.pdf'" comme étant à restituer telle quelle sans guillemets double mais avec les guillemets simples (en interne ils seront mêmes préfixés d'un anti-slash).

Maintenant que se passe-t-il lorsque PHP passe la main ?
L'instruction header a la particularité d'être une fonction qui s'adresse directement au serveur (Apache ou Nginx) et c'est lui qui procède au traitement de la chaine de caractère transmise par PHP.

Donc le serveur reçoit l'instruction de définir une en-tête (la fonction header) et procède au découpage du paramètre de celle-ci afin d'en déduire la/les instructions à appliquer à ses en-têtes.

D'un prime time il découpe au niveau des point-virgules qui est le marqueur indiquant la fin d'une instruction et en sort donc ici deux "jeux de données" :
- Disposition:attachment et
- filename='Bondecommande.pdf'

Ensuite il cherche à déterminer les "étiquettes" (appelons-les comme ça, je ne connais pas leur nom officiel) et leur valeur associée. Ainsi il détermine :
- la donnée attachment est attachée à l'étiquette disposition (laissons ce fait de côté)
- la donnée 'Bondecommande.pdf' est attachée à l'étiquette filename (remarquez l'omniprésence des guillemets simples).

Du coup, par cette réflexion, j'en viens à me dire que la différence d'interprétation entre votre système, Parsimonhi, et celui de Lbolux vient peut-être d'une différence de configuration du serveur. Il m'apparaît probable que par un de vos savant réglage vous vous soyez affranchi du problème du "avec ou sans apostrophe" et que dans le cas où votre serveur en détecte dans ce type de contexte il ferme simplement les yeux en faisant comme s'ils n'existaient pas.
Peut-être une piste, qu'en pensez-vous ?

Tout ça pour dire que j'ai été amené à utiliser ce genre d'instruction en production sur différents serveurs (tous Apache) et que la version sans les guillemets simples ne m'a jamais fait défaut, mais qu'à cette heure je serais bien incapable de pouvoir vous dire quel élément permettrait de s'affranchir de ce détail.


Merci de m'avoir lu et allez boire un verre, c'est mérité. Smiley biggrin
Modérateur
Bonjour,
Greg_Lumiere a écrit :
Ma surprise est plus du fait que chez vous, Parsimonhi, cela fonctionne alors que théoriquement vous devriez obtenir le même résultat que Lbolux.

C'est évidemment inquiétant et il fallait absolument expliquer ça, sinon, c'est bug assuré.

J'ai donc refait tous mes tests très soigneusement (réduction du code aux seules lignes nécessaires, vidage du dossier de téléchargement, etc.).

J'ai finalement réussi à reproduire le problème chez moi sur Windows 10 + Firefox 63 et sur Mac OS + Firefox 64 : les simples quotes sont effectivement laissées autour du nom du fichier.

Par contre, avec ie version 11.407 et Microsoft Edge version 42 + EdgeHTML version 17 sous Windows 10, ainsi qu'avec Chrome et Safari sous Mac OS, les simples quotes sont bien retirées autour du nom du fichier automatiquement.

Tout ceci avec le même serveur.

Je n'ai pas testé d'autres navigateurs, mais les présents tests semblent indiquer que ce n'est pas un problème de serveur.

Greg_Lumiere a écrit :
... Du coup, par cette réflexion, j'en viens à me dire que la différence d'interprétation entre votre système, Parsimonhi, et celui de Lbolux vient peut-être d'une différence de configuration du serveur. Il m'apparaît probable que par un de vos savant réglage vous vous soyez affranchi du problème du "avec ou sans apostrophe" et que dans le cas où votre serveur en détecte dans ce type de contexte il ferme simplement les yeux en faisant comme s'ils n'existaient pas.
Peut-être une piste, qu'en pensez-vous ?

J'ai moi aussi pensé à la piste du serveur. Mais ce n'est pas ça finalement (voir plus haut).

Il s'agit bien d'un problème de syntaxe qui est interprétée différemment d'un navigateur à l'autre, et notamment firefox qui semble être plus stricte que les autres. En poussant un peu plus loin sur ce sujet précis, il apparait que c'est un vrai cauchemar. Par exemple, on peut essayer de lire ce document http://test.greenbytes.de/tech/tc2231/, mais sans trop insister sinon c'est un coup à mal dormir. Tant qu'on utilise des noms de fichiers simples (pas d'espace, pas de quote, et que des caractères ascii de base), on n'a pas de problème et on peut se permettre de ne pas mettre de quotes du tout. Mais dès que le nom des fichiers contient d'autres caractères, c'est la cacophonie totale.

Pour limiter la casse, on peut utiliser la syntaxe suivante, en supposant que la variable $file contient le nom du fichier qu'on souhaite voir du côté du client :
header('Content-Disposition: attachment; filename="'.str_replace('"', '\\"', $file).'"');


Si on connait d'avance le nom du fichier, par exemple "nom pénible.pdf", on peut utiliser :
header('Content-Disposition: attachment; filename="nom pénible.pdf"');


Dans un contexte francophone, cela devrait suffire.

En tout cas, merci d'avoir identifié la ligne fautive : j'étais passé à côté. Et j'ai surement dû laisser trainer des bugs par le passé à cause de ça.

Amicalement,
Modérateur
Autant pour moi, c'est bien le navigateur qui s'occupe de ce point.

Le document que vous liez Parcimonhi est fort intéressant. Même s'il semble dater, il permet tout de même d'en tirer leçon.

D'abord, ce n'est pas parce qu'une RFC est établie qu'elle est appliquée à la lettre par les acteurs.

Ensuite, que tant que nous restons dans un cas de figure simple, soit avec l'attribut content-disposition correctement renseigné et sans plus fioriture, on note que l'usage des guillemets doubles semble être fonctionnel partout (pas les simples). On peut même dire à la limite que dans le doute on les place dans notre code source ainsi 0 problème.

Pour l'attribut filename en lui-même, j'ai envie de conclure sur un "comme le système de fichiers du système d'exploitation (SE).

L'Histoire nous a amené à bien des évolutions sur ce point. Passage du cap des huit caractères, acceptation de noms à rallonge, variété des caractères admissibles, distinction ou non de la casse (selon le système et le contexte) etc... Mais une chose est restée, immuable comme le marbre : il existe toujours des disparités entre les SE.

A dire vrai le nombre de type de plate-forme n'a pas l'air si vaste. En gros c'est Linux, Mac ou Windows.
Du coup on pourrait se dire "c'est rien, je n'ai qu'à détecter le SE et adapter mon code en fonction du résultat. Ouais ho, c'est juste 2 déclinaisons à faire".

Mais bon, vous comme moi savez que nous créons là de la spécificité et que ce n'est jamais bon à terme et toujours une mauvaise idée dès le début.

Alors, la seule solution pérenne consiste à trouver "un truc" qui fonctionne en tout temps, partout et pour tous.

Cette solution existe et a même un nom ! En effet il faut avoir... (roulement de tambour)... une convention de nommage à toute épreuve.
Entre-autre lois on devrait y trouver celle-ci :
- aucun caractère autorisé sauf... (liste de caractères)

Et ce "sauf" devra être très restrictif.
Si l'un d'eux apparaît de travers un jour, vous le blacklistez.
Vous apprenez que tel système accepte tel caractère mais n'êtes pas sûr sur les autres, laissez-le en dehors de votre liste.

Il est très facile de normaliser une chaîne de caractère avant de l'utiliser comme nom de fichier. Smiley langue



Il était là un sujet fort intéressant. Merci aux participants.