OVH Cloud OVH Cloud

probleme de header

15 réponses
Avatar
Demosthene
Bonjour à tous,


Je propose le téléchargement d'un fichier *.txt hors du navigateur.

Après recherche de mon problème sur google, j'ai corrigé mes entêtes :

header("Cache-Control: public");
header("Content-Description: File Transfer");
//header("Content-disposition: attachment; filename=Blabla");
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
//header("Content-Length: 10000");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");
header("Expires: 0");


J'ai commenté deux lignes car mon fichier est généré à la volée.
Je ne connais pas a priori la longueur.

Celà a toujours marché avec Firefox mais jamais sous IE, il génère une
erreur :
"IE n'a pas pu ouvrir ce site Internet. Le site n'est pas disponible ou
n'a pas pu être trouvé. Réessayez ultérieurement"

Y-a-t-il une subtilité qui m'échappe ?

Connaissez-vous un site de référence traitant de la question ?
php.net ne contient pas grand chose sur le sujet

Merci à l'avance pour toute piste.


Démosthène

10 réponses

1 2
Avatar
Sebastian 'CrashandDie' Lauwers
Demosthene wrote:

Bonjour à tous,


Bonjour tout seul,

Je propose le téléchargement d'un fichier *.txt hors du navigateur.


Ok, rien de mal de ce côté là, par "hors du navigateur" j'entends
obliger le téléchargement, et non pas l'ouverture par le navigateur...

Après recherche de mon problème sur google, j'ai corrigé mes entêtes :

header("Cache-Control: public");


pas vraiment nécessaire... surtout que vous mettez le pragma à no-cache
plus tard... Utilisez soit un private ou alors no-Cache ici aussi

header("Content-Description: File Transfer");


Pas sûr que ce soit une description valide mais passons

//header("Content-disposition: attachment; filename=Blabla");


ca c'est correct, pas besoin de le commenter, puisque c'est assé
important, là, le fichier s'apellera tonscript.php et non pas tonfichier.txt
Cependant, je pense qu'il est utile de rappeller, et si mes souvenirs
sont bons, que une certaine RFC, la 2616, ou la 2661, je sais plus,
déconseille l'utilisation de ce header, pour un tas de raisons de
sécurité etc, et que, officiellement, il n'est pas censé exister,
toutefois, vu qu'il est de plus en plus utilisé, le W3 est en train de
documenter son utilisation, et les risques potentiels, je ne sais pas où
ça en est, si quelqu'un peut préciser...

header("Content-Type: application/octet-stream");


Pas sûr de ça non plus, essaye plutot:

header ("Content-Type: text/plain");

header("Content-Transfer-Encoding: binary");


binaire alors que c'est un fichier texte?

//header("Content-Length: 10000");


il est possible de le faire automatiquement...

header("Pragma: no-cache");


Pragma indique au navigateur si il doit renvoyer une requête au serveur
d'origine ou non, ici vous lui dites que non, pourquoi lui autoriser à
stocker le fichier alors? Indiquez no-cache aux deux, ou alors private
au cache-control et supprimez cette ligne...

header("Cache-Control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");


deux cache-control dans la même page...

header("Expires: 0");


En envoyant un expire avec une valeure invalide, vous indiquez donc au
navigateur qu'il doit vérifier l'état du fichier à chaque appel, sans
stockage... Le premier cache-control est donc très contradictoire

J'ai commenté deux lignes car mon fichier est généré à la volée.


Pas un problème

Je ne connais pas a priori la longueur.


Il existe des fonctions qui permettent de connaitre la longueur d'une
chaine, voire même d'un fichier, ceci peut donc aussi être fait à la
volée...

Y-a-t-il une subtilité qui m'échappe ?


Quelques-unes ;)

Connaissez-vous un site de référence traitant de la question ?
php.net ne contient pas grand chose sur le sujet


Il en existe pas mal, principalement les RFC de HTTP, ou quelques sites
qui synthétisent les informations... Mais va falloir se mettre à
l'anglais pour avoir des fichiers réellement interressants...

Merci à l'avance pour toute piste.


HTH,

Démosthène


S.

Avatar
Demosthene
En résumant :

header("Content-disposition: attachment; filename=Blabla");
header("Content-Description: File Transfer");

// C'est le plus sûr moyen que j'ai trouvé d'avoir la boite de choix
// entre sauver sur disque et visualiser directement.
header("Content-Type: application/octet-stream");

// pas vraiement fait attention sur ce point
header("Content-Transfer-Encoding: text");

// Vous avez parfaitement raison en plus, quel bille je fais par moment ;)
header("Content-Length: $len_chaine");

header("Cache-Control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");




Cependant, je pense qu'il est utile de rappeller, et si mes souvenirs
sont bons, que une certaine RFC, la 2616, ou la 2661, je sais plus,
...

Je vais regarder ces RFC avec attention, peut-être en retirerais-je un
peu de sagesse ;)

Y-a-t-il une subtilité qui m'échappe ?


Quelques-unes ;)
ARRGH ! j'en étais sûr ;)


Il en existe pas mal, principalement les RFC de HTTP, ou quelques sites
qui synthétisent les informations... Mais va falloir se mettre à
l'anglais pour avoir des fichiers réellement interressants...
iaisse soeur ;)


Merci
Je tente ces conseils et je reviens

Démosthène


Avatar
Patrick Mevzek
Le Thu, 26 May 2005 19:48:28 +0200, Sebastian 'CrashandDie' Lauwers a
header("Cache-Control: public");


pas vraiment nécessaire... surtout que vous mettez le pragma à no-cache
plus tard... Utilisez soit un private ou alors no-Cache ici aussi


Si, nécessaire, et préférable à Pragma, mais autant utiliser les deux.
Pragma c'est plutôt du HTTP/1.0, et Cache-Control (plus fin) du HTTP/1.1

header("Expires: 0");


En envoyant un expire avec une valeure invalide,


Il faut effectivement mettre une *date* dans l'entête Expires, et il faut
mettre la même date que la date actuelle pour un document ne devant pas
être mis en cache.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>


Avatar
Demosthene

Si, nécessaire, et préférable à Pragma, mais autant utiliser les deux.
Pragma c'est plutôt du HTTP/1.0, et Cache-Control (plus fin) du HTTP/1.1



Je viens de faire une grande découverte !

Fichier de test fichier.php :
<?
header("Content-disposition: attachment; filename=fichier.txt");

echo "texte à sauver";
?>

Fonctionne sur IE et FireFox.

Mais toujours pas mon fichier.

Explications et situation :

Mon fichier généré et produit après une transformation de nom par
rewrite rule de type " attrape-tout "

------------------------------------
RewriteEngine on
RewriteRule (.*) fichier.php?id=$1
------------------------------------

cette différence de nom doit être à l'origine du trouble du comportement
de IE, qui me semble un tantinet paranoïaque dans cette histoire.

Est-ce un problème de paramétrage du serveur ?
Y-a-t-il moyen d'endormire l'excés sécuritaire d'IE avec un header
particulier ?

Je vais dans l'immédiat coder mes liens en "fichier.php?id=fichier.txt,
mais je ne veux pas laisser transpirer cette information très longtemps.

Comment faire pour contourner ce comportement bloquant.

Merci d'avance

Démosthène.

Avatar
__marc.quinton__
Demosthene wrote:
Bonjour à tous,


Je propose le téléchargement d'un fichier *.txt hors du navigateur.


regarder les applications qui le font deja : phpmyadmin par exemple
permet d'exporter des fichiers au format zip.

d'autre part ayant réalisé cette fonction, je me souviens qu'il
était nécessaire de faire un traitement legerement différent
en fonction du navigateur. ($_SERVER["HTTP_USER_AGENT"])

Avatar
John GALLET
Je viens de faire une grande découverte !
Magnifique !


header("Content-disposition: attachment; filename=fichier.txt");


Ca ne fait jamais que 4 ou 5 ans que c'est écrit dans la FAQ de ce
forum... http://faqfclphp.free.fr/#rub4.11

Vous ne vivriez pas dans un tonneau vous pas hasard ?

cette différence de nom doit être à l'origine du trouble du comportement
Doit être ou est ? Faites donc le test dans un répertoire sans

rewriting avant de chercher dans tous les sens, ça vous gagnera du temps.

JG

Avatar
Demosthene
John GALLET wrote:
Je viens de faire une grande découverte !


Magnifique !


header("Content-disposition: attachment; filename=fichier.txt");



Ca ne fait jamais que 4 ou 5 ans que c'est écrit dans la FAQ de ce
forum... http://faqfclphp.free.fr/#rub4.11

Vous ne vivriez pas dans un tonneau vous pas hasard ?


cette différence de nom doit être à l'origine du trouble du comportement


Doit être ou est ? Faites donc le test dans un répertoire sans
rewriting avant de chercher dans tous les sens, ça vous gagnera du temps.
Merci le sarcasme ;)


sans rewriting celà marche, mais j'ai besoin du rewriting :)
Je vais voir du côté du serveur.

Cordialement

Démosthène


Avatar
Domenjoud Yannick
Y-a-t-il moyen d'endormire l'excés sécuritaire d'IE avec un header
particulier ?


haha, c'est une blague ? On parle bien de Internet Explorer ? L'excès
sécuritaire d'une passoire c'est quoi ? J'ai du mal à suivre !!

Cordialement,
Yannick

PS: dsl pour le troll

Avatar
Demosthene
haha, c'est une blague ? On parle bien de Internet Explorer ? L'excès
sécuritaire d'une passoire c'est quoi ? J'ai du mal à suivre !!


se déclencher pour tout et surtout n'importe quoi, pourquoi ;)
j'aime bien le mot français pour "troll" : "marronier" ;)

Démosthène

Avatar
jeremie.fouche
wrote in message news:<d7752p$b55$...
Demosthene wrote:
Bonjour à tous,


Je propose le téléchargement d'un fichier *.txt hors du navigateur.


regarder les applications qui le font deja : phpmyadmin par exemple
permet d'exporter des fichiers au format zip.

d'autre part ayant réalisé cette fonction, je me souviens qu'il
était nécessaire de faire un traitement legerement différent
en fonction du navigateur. ($_SERVER["HTTP_USER_AGENT"])


oui

j'utilise (basé sur FPDF en mode téléchargement) :

$fname = $CONFIG['DL_DIR'].$dl_files[$f];
$name = basename($fname);

if ( file_exists($fname) && ($fh = fopen($fname, 'r')) )
{
$content = fread($fh, filesize($fname));
fclose ($fh);

# Envoi des header de telechargement
if ( isset($_SERVER['HTTP_USER_AGENT'])
&& strpos($_SERVER['HTTP_USER_AGENT'],'MSIE') )
{
header('Content-Type: application/force-download');
}
else
{
header('Content-Type: application/octet-stream');
}

if(headers_sent())
exit("Some data has already been output to browser, can't send file.");

# Envoi
header('Content-Length: '.strlen($content));
header('Content-disposition: attachment; filename='.$name);
echo $content;

exit();
# --------- FIN DU SCRIPT -------------
}
else
{
# ERREUR
}

--
Jérémie


1 2