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

Langage PHP Discussion :

Forcer téléchargement ne marche pas sous IE


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Dionyzos
    Homme Profil pro
    Développeur & Designer Web
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur & Designer Web

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 156
    Points
    156
    Par défaut Forcer téléchargement ne marche pas sous IE
    Bonjour,

    Après de multiples recherches sur Google et sur ce forum, je ne trouve pas de réponse à mon problème spécifique que voici :
    Je souhaite forcer le téléchargement d'une image depuis un album photo en ligne.
    Après avoir trouvé tout un tas d'exemples de scripts PHP sur le web, j'ai fini par trouver le script adapté à mon besoin, le voici :

    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
    <?php
    $num = $_GET['num'];
    $file = 'http://www.monsite.fr/ album/ '.$num.'.jpg';
    $name = $num.'.jpg';
    //$size=strlen(file_get_contents($file)); // Pour un fichier distant
    $size=filesize($file); // Pour un fichier local
     
    header('Content-Type: application/octet-stream');
    //header('Content-Type: application/force-download');
    header("Content-Transfer-Encoding: image/jpeg\n");
    header('Content-Length: '.$size);
    header('Content-disposition: attachment; filename='.$name.';');
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    readfile($file);
    exit();
    ?>
    Le script marche à la perfection sous Firefox et Chrome, mais pas sous IE(9).
    Lorsque je l'exécute sous IE, la boite de dialogue "enregistrer sous" apparaît bien, mais une fois l'image téléchargée, celle-ci fait 0 octet et est donc illisible.

    J'aimerais savoir ce qui ne plait pas à IE dans mon script ?

    Merci aux âmes charitables et éclairées de m'aider

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    J'ai testé ton code, il me semble correct.
    J'ai réussi à le faire fonctionner avec IE9, et aussi les autres.

    Le filesize($file); me donnait un warning (en faisant un die juste après on peut le voir).
    Donc j'ai décommenté la ligne au dessus avec le strlen(), ça a fonctionné.

    Fais attention quand même au $_GET['num'] que tu réinjectes directement dans ton header, il pourrait y avoir n'importe quoi dedans.

  3. #3
    Membre habitué Avatar de Dionyzos
    Homme Profil pro
    Développeur & Designer Web
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur & Designer Web

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 156
    Points
    156
    Par défaut
    Merci pour cette réponse Climoo, je vais tester ca.
    Je pensais que la ligne commenter servait pour la version en ligne du site, et comme j'étais encore en local sur mon PC, j'ai pas essayé de la décommenter.

    Merci aussi pour l'astuce du GET_.

  4. #4
    Membre habitué Avatar de Dionyzos
    Homme Profil pro
    Développeur & Designer Web
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur & Designer Web

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 156
    Points
    156
    Par défaut
    Je confirme, ca marche avec IE maintenant. Donc il s'agissait bien de la méthode utilisée pour récupérer la taille de l'image.

    Merci encore

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Dionyzos Voir le message
    Je confirme, ca marche avec IE maintenant. Donc il s'agissait bien de la méthode utilisée pour récupérer la taille de l'image.

    Merci encore
    Quelques explications : les commentaires
    // Pour un fichier distant
    // Pour un fichier local
    sont relatifs au site sur lequel tu te trouve. Et donc si tu teste en local sur ta machine avec un fichier qui se trouve sur le web, ce n'est pas le même serveur et donc c'est un fichier distant.

    Mais cela ne fonctionnerait pas mieux si tu mettait ce script sur ton serveur distant car en écrivant une url absolue "http://www.monsite.fr/..." tu vas chercher l'adresse en passant par le web soit par l'extérieur du serveur et donc c'est aussi un fichier distant.

    Pour que filesize() fonctionne correctement il faut lui donner une adresse locale et pour ce faire lui donner des chemins relatifs. Dans ton exemple ce serait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $file = 'album/ '.$num.'.jpg';
    Tu aurais tout intérêt à utiliser cette méthode car filesize est beaucoup plus rapide que strlen(file_get_contents($file)) et c'est pour cela que cette ligne est par défaut en commentaire. C'est en cas de besoin mais on évite de l'utiliser par défaut.

    Sinon si tu attends une valeur numérique dans $_GET['num'] tu peux la tester avec ctype_digit(). Comme disais Climoo tu as intérêt de ne pas oublier de la tester car c'est une source majeur de piratage => faille critique de sécurité.

  6. #6
    Membre habitué Avatar de Dionyzos
    Homme Profil pro
    Développeur & Designer Web
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur & Designer Web

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 156
    Points
    156
    Par défaut
    Un grand merci pour toutes ces infos

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

Discussions similaires

  1. Marche pas sous tomcat
    Par jeromejanson dans le forum Applets
    Réponses: 3
    Dernier message: 21/06/2005, 13h07
  2. [pop-up] window.open ne marche pas sous IE...
    Par Palmic dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/05/2005, 16h47
  3. [W3C] Pourquoi ça ne marche pas sous IE
    Par polo-j dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 16/02/2005, 17h07
  4. URGENT : Request.Form ne marche pas sous IE6
    Par Laurent Outan dans le forum ASP
    Réponses: 9
    Dernier message: 16/07/2004, 16h25
  5. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 10h28

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