IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] Forcer téléchargement : ènième problème


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 22
    Points
    22
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    voilà le script que j'utilise, a moitié pompé, a moitié customisé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  3. #3
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    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?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    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...

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

  7. #7
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    dans ce cas, peut être faut-il aussi changer le time_limit qui doit être à 30s par défaut
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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() ??)

  10. #10
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    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 ?

  12. #12
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Forcer téléchargement (header)
    Par dib258 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/03/2006, 17h49
  2. Problème forcer téléchargement fichier
    Par cams dans le forum Langage
    Réponses: 34
    Dernier message: 15/12/2005, 16h42
  3. Sql Server 2005 Express - Problème de connexion
    Par vandeyy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/11/2005, 15h53
  4. [SQL Server 2005 Express] Problème d'installation.
    Par Nadd dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/09/2005, 17h47
  5. [ASP 3] Forcer téléchargement
    Par nborde dans le forum ASP
    Réponses: 5
    Dernier message: 10/12/2004, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo