Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2006, 14h33   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 30
Points : 12
Points : 12
Par défaut [SQL] Forcer téléchargement : ènième problème

bonjour, j'deviens complètement fou avec un script que j'avais déjà fait pour forcer le téléchargement de tout type de fichiers!!
ça marchait nickel, et puis plus rien...

j'ai lu une bonne trentaine de discussions sur le sujet , la FAQ, surtout attentivement la page Header du manuel PhP avec les derniers Posts proposés, puis celle-ci très intéressante...

mais rien n'y fait; en plus ça marche toujours nickel en local, mais sur le serveur distant, ça déconne: page blanche qui s'affiche.
peut-être une config PhP modifiée sur le serveur ???

le code que j'utilise:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
header('Content-Disposition: attachment; filename="'.basename($fichier).'"');
header("Content-type: application/force-download");				
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($fichier));
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
flush();
readfile($fichier);
exit;
mais avant celà, j'ai:
* une variable de session donc un session_start();
* des includes de fichiers,
* une requète SQL pour récupérer le nom du fichier à télécharger...

j'ai essayé avec les options ob_start() ob_clean() etc...,
j'ai essayé avec tous les divers header présents dans toutes les discussions trouvées: qui remplacent les Pragma, les Content-Type, etc...

avez-vous une idée de piste que j'ai pas exploré?
ou le bout de code qui marche parfaitement tout le temps avec tous les navigateurs?
fred23195 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 14h57   #2
Rédacteur
 
Avatar de MasterOfChakhaL
 
Homme
Développeur Web
Inscription : juin 2004
Messages : 2 148
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Conseil

Informations forums :
Inscription : juin 2004
Messages : 2 148
Points : 2 628
Points : 2 628
voilà le script que j'utilise, a moitié pompé, a moitié customisé...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# récupération du chemin, du contenu, de la taille et du nom
$t_file_url = fonction qui me récupère l'url du fichier
$t_content = file_get_contents( $t_file_url );
$t_filesize = filesize( $t_file_url );
$t_filename = basename( $t_file_url );

# nettoyage du buffer et annulation de la compression
@ob_end_clean();
@ini_set('zlib.output_compression','Off');

#envoi des entêtes du fichier et directives de téléchargement
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');

header('Content-Transfer-Encoding: none');
header('Content-Type: application/octet-stream; name="'.$t_filename.'"' );
header('Content-Disposition: inline; filename="'.$t_filename.'"');
header('Content-Length: '.$t_filesize );

#envoi du fichier
echo $t_content;
exit();
MasterOfChakhaL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 15h47   #3
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
A la place de basename j'aurais utilisé $_SERVER['DOCUMENT_ROOT'] car au moin tu es sur du chemin. Je pense que le problème peut venir de là.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h11   #4
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 30
Points : 12
Points : 12
merci de ta réponse;
c'est le script qui était proposé sur le site Ibilab.net;

bon, après quelques tests encore, je crois qu'il s'agit d'un problème de taille de fichier, avec les fonctions readfile() ou file_get_contents().

en local, j'ai essayé de faire un ini_set("memory_limit",-1) ou ini_set("memory_limit","200M"), il modifie bien la donnée memory_limit puisqu'en faisant phpinfo(), la valeur est bien changée, mais dans la pratique, le téléchargement reste toujours impossible (page blanche) pour des fichiers supérieurs à 8-10M...

sur le serveur distant, ya même pas l'option --enable-memory-limit active, donc j'peux rien faire... mais le téléchargement reste possible aussi sur les petits fichiers.

vous avez une idée?
fred23195 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h21   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 30
Points : 12
Points : 12
autre remarque :

en local, la fonction readfile() marche mieux que file_get_contents() : le téléchargement s'opère quelque soit la taille du fichier, (même sur un gros fichier de 160M sans avoir modifié le memory_limit alors que la valeur par défaut est 8M (phpinfo))!

mais toujours pas sur le serveur distant...
fred23195 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h28   #6
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
As tu testés pour l'histoire de la mémoire c'est à dire en local tu places la taille mémoire à 8 et tu tentes de télécharger le fichier qui est supérieur à 8. Si le fichier se télécharge c'est que le problème ne vient pas de là. Essay de capturer l'erreur c'est à dire que tu places en commentaire la zone des header();
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h31   #7
Rédacteur
 
Avatar de MasterOfChakhaL
 
Homme
Développeur Web
Inscription : juin 2004
Messages : 2 148
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Conseil

Informations forums :
Inscription : juin 2004
Messages : 2 148
Points : 2 628
Points : 2 628
dans ce cas, peut être faut-il aussi changer le time_limit qui doit être à 30s par défaut
MasterOfChakhaL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h34   #8
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par MasterOfChakhaL
dans ce cas, peut être faut-il aussi changer le time_limit qui doit être à 30s par défaut
J'en doute je ne pense pas que ça mettre 30 secondes pour lire un fichier de 8 mégas bref pourquoi pas tester.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 16h44   #9
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 30
Points : 12
Points : 12
effectivement, c'est pas un problème de time_limit(): la page devient blanche et figée presque aussitôt, pas au bout de 30s.

pour le test memory_limit() en local:
si je fais
Code :
ini_set("memory_limit","2M");
avec file_get_contents() les téléchargements sont bien bloqués pour des fichiers supérieur à 2M, mais pas avec readfile()!

(comment il faut faire pour afficher les erreurs des header() ??)
fred23195 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 17h13   #10
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Tu mets en commentaire les headers et tu executes directement le fichier pour voir s'il te retourne quelque chose.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 17h28   #11
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 30
Points : 12
Points : 12
Ok.
idem:
pour les fichiers inférieurs à 10-12M, il me renvoie le contenu du fichier (codé); mais pour les autres, pages blanches...
ça doit vraiment être un problème de php.ini, faut qu'je titille l'hébergeur...

il ya une explication pour la différence de traitement entre readfile et file_get_contents ?
fred23195 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 18h10   #12
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
readfile doit lire le contenu directement sans cumuler le contenu mais pas la stocker dans une sortie. L'autre récupère le contenu du fichier entièrement et l'envoy sur le return d'ou la prise de mémoire
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h08.


 
 
 
 
Partenaires

Hébergement Web