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

JavaScript Discussion :

[AJAX] Appeller un script PHP via Ajax pour télécharger un gros fichier.


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut [AJAX] Appeller un script PHP via Ajax pour télécharger un gros fichier.
    Bonsoir,
    J'ai un script PHP qui permet de télécharger des fichiers à distance.
    En l'appellant directement le navigateur arrive à télécharger.

    Ce script php je l'appelle via Ajax ce qui me permet d'injecter les éventuels erreur dans un div. Malheureusement le navigateur ne telecharge pas le fichier s'il n'y a aucune erreur.

    voici le code simplifié:

    PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $pdf_file ="http://hebergeurdegrosfichier.com/monfichierdistant.pdf";
    ini_set('allow_url_fopen', '1');
    // on renome le fichier.
    $user_pdf_file = "pourToiInternaute.pdf";
    if(@fopen($pdf_file, "r")) {
    header("Content-Type: application/force-download\n");
    header("Content-Disposition: attachment; filename=$user_pdf_file");
    readfile($pdf_file);
    exit;
    } else echo 'Erreur';
    pour la fonction ajax j'utilise celle du tutorial avec la méthode POST (voir liste liée)

    S'il y a une erreur, il arrive bien à afficher les erreurs mais dans la fonction go(), comment Ajax gère t-il la réponse (Cf: xhr.responseText) dans le cas d'un télechargement d'un fichier?
    essaye t-il de me mettre le pdf à télécharger dans le div?

    Comment faire pour que les headers php fonctionne via ajax?
    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Salut, je doute très fortement que ceci fonction avec "AJax".

    Tu devrais plutot regarder du côte d'une iframe cachée pour faire ça.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    J'ai essayé un appel synchrone...sans succès non plus...
    merci jojosbiz je vais voir du coté d'iframe...

    Mais n'hésite pas à laisser un exemple de code si tu as déjà tenté l'experience avec iframe.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 60
    Points : 65
    Points
    65
    Par défaut
    Ajax te permet de recevoir dans ton javascript côté client une réponse du serveur en format text ou xml. Ce n'est donc pas étonnant que tu ne puisse pas envoyer un fichier avec ajax. Au mieux, tu ne pourras qu'obtenir le contenu de ce fichier...

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    Ajax te permet de recevoir dans ton javascript côté client une réponse du serveur en format text ou xml. Ce n'est donc pas étonnant que tu ne puisse pas envoyer un fichier avec ajax. Au mieux, tu ne pourras qu'obtenir le contenu de ce fichier...
    JE N'ENVOIE PAS UN FICHIER AVEC AJAX !!
    Ajax mais sert juste de declencheur en envoyant des paramètres à un script php sans recharger ou quitter la page mère.
    Mais c'est bien PHP qui gère le renomage et l'envoie du fichier...En cas de succès je n'envoie aucun echo (aucun text) donc je ne vois pas en quoi ça pourrait interferer avec ajax.

    Inversement, j'ai essayé un echo "<iframe src="mongrospdf.pdf"><iframe>" puisque qu'ajax attend un text mais sans succès pour un pdf mais marche avec un fichier html
    J'ai pas mal cherché mais je ne sais pas comment le header de php peut communiquer avec une iframe.
    Je vais partir d'un pb + simple: lancement d'un telechargement à partir d'une iframe.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    En faisant du DOM, non du innerHTML ça marche déjà mieux.
    J'arrive maintenant à télécharger un fichier distant renomé à la volé dans une iframe.
    En fait en fonction de la reponse d'ajax je pourrais générer soit une iframe qui m'enverra le fichier soit un message d'erreur dans mon div prévu à cet effet ou voir même dans l'iframe.
    Restera plus qu'à essayer avec un tag object plutôt qu'une iframe.

    Le code demain (peut-être ).

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    dans la fonction go()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    xhr.onreadystatechange = function(){
     if(xhr.readyState == 4 && xhr.status == 200){
    var result = xhr.responseText;
    document.getElementById(destinationDiv).innerHTML=result;
    if(document.getElementById(destinationDiv).firstChild.getAttribute("id")=="msg_succes") download();
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function check(){
    go("error_message","http://url_qui_ckeck/check.php","CODE");
    }
     
    function download(){
    var iframe = document.createElement("iframe");
    iframe.setAttribute("src", "http://url_qui_telecharge/dl.php");
    iframe.setAttribute("style", "display:none");
    document.getElementById("error_message").appendChild(iframe);
    }

    j'ai un input avec un id="CODE"...au clic du bouton j'appelle un php (check.php) via AJAX (fonction go)
    check.php va mettre en session comme quoi le fichier existe et que l'utilisateur peut le telecharger.
    si j'ai id = msg_succes car en reponse j'ai dans check.php un echo '<span id="msg_succes">bon telechargement!</span>';
    je crée une iframe par DOM et je charge dl.php qui va rechecker les variables mises en session puis lancer le telechargement.

    bon j'ai pas reussi avec la balise object (tant pis pour le xhtml strict)..mais si je trouve je posterais.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 68
    Points
    68
    Par défaut
    du coup vu que je sépare le controle des messages de retour du lancement du telechargement...l'iframe ne sert plus à rien.
    la fonction download devient tout simplement:

    function download(){
    window.location = "http://url_qui_telecharge/dl.php";
    }

    Je ne l'ai pas precisé mais à l'interieur de ces fichiers php, je controle bien sûr que ces scripts ne soient pas lancé directement par un check de la variable $_SERVER['HTTP_REFERER'] ainsi que des variables de session.

    je suis de nouveau en xhtml strict

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 40
    Points
    40
    Par défaut
    Même si c'est un peu tard ce système te permet de télécharger le fichier certe.
    Cependant si le fichier n'existe pas, si tu as une erreur dans ta page http://url_qui_telecharge/dl.php ca va te remplacer la page de ton site par http://url_qui_telecharge/dl.php et ceci est totalement contraire au principe d'un site codé avec ajax.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2016, 18h41
  2. [AJAX] Appeler une fonction d'un fichier PHP via $.ajax()
    Par informer dans le forum jQuery
    Réponses: 9
    Dernier message: 11/03/2014, 00h47
  3. Réponses: 8
    Dernier message: 19/11/2009, 15h42
  4. [AJAX] Appeler un script php apres traitement réponse Ajax
    Par lekunfry dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/10/2008, 13h34
  5. [AJAX] Appeller une page php en Ajax pour action sur Mysql
    Par Overstone dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 20/07/2007, 18h23

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