Download File avec Ajax

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Download File avec Ajax

Re: Download File avec Ajax

par jeeday » 20 déc. 2014, 03:26

Concernant la dernière partie du code, j'ai fais une erreur voici le code fonctionnel
[javascript]
//Créer un lien dans la page -> envoi une requête qui délivre le contenu du lien crée -> simule un clique sur ce lien -> puis supprime ce lien.
function creerLienEtCliquer()
{
//Créer le lien avant la fermeture de la balise body invisible (grâce à style="visibility:hidden;")
document.getElementsByTagName('body')[0].innerHTML += '<a id ="monlien" href="" style="visibility:hidden;">lien_download</a>';
//Envoi une requête ajax et remplis l'attribut "href" du nouveau lien crée avec le contenu reçu (le lien de téléchargement)
document.getElementByTag('monlien').href = ajaxPost("fichier_cible.php", "monlien", "param1=blabla&param2=blabla2");
//Simulation du click sur le lien
simuleClick('monlien');
// à la fin on supprime le lien de la page ni vu, ni connu
removeElement('monlien') ;
}
[/javascript]

Voici le code entier d'une page php fonctionnelle sur laquelle je viens de réaliser un test
<!DOCTYPE>
<html>
<head>
	<title>Page téléchargement AJAX</title>
</head>
<?php


?>
<body>
<button value="envoyer" onclick="creerLienEtCliquer();">Envoi</button>
<script>

function getXMLHttpRequest()
{
    var xhr = null; // On déclare une variable xhr à null

    if (window.XMLHttpRequest || window.ActiveXObject)// Teste prise en charge des XMLHttpRequest
    {
        if (window.ActiveXObject) /*Si Internet Explorer alors on utilise les ActiveX*/
        {
            try /*On teste IE7 ou supérieur*/
            {
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e)/*Si une erreur est levée, alors c'est IE 6 ou inférieur*/
            {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
        else /*Navigateurs récents(Firefox, Opéra, Chrome, Safari, ...)*/
        {
            xhr = new XMLHttpRequest();
        }
    }
    else
    {
        alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
        return null;
    }
    return xhr; // On retourne l'objet xhr
}

/* -- Envoi de données vers un fichier avec Ajax -- */

function ajaxPost(url,idDiv,donnees)//url : emplacement du fichier cible | donnees : envoi sous forme var1=donnee1&var2=donnee2&var3=donnee3
{
    var xhr = getXMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0))
        {
            //Retourner le contenu
                return xhr.responseText;
        }
    }
    xhr.open("POST", url, true);/*On ouvre une connexion en méthode POST vers url*/
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(donnees); /*permet l'encodage des POST*/
}

function simuleClick(idBtn)
{
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
    document.getElementById(idBtn).dispatchEvent(evt);
}


//Créer un lien dans la page -> envoi une requête qui délivre le contenu du lien crée -> simule un clique sur ce lien -> puis supprime ce lien.
function creerLienEtCliquer()
{
    //Créer le lien avant la fermeture de la balise body invisible (grâce à style="visibility:hidden;")
    document.getElementsByTagName('body')[0].innerHTML += '<a id ="monlien" href="" style="visibility:hidden;">lien_download</a>';
    //Envoi une requête ajax et remplis l'attribut "href" du nouveau lien crée avec le contenu reçu  (le lien de téléchargement)
    document.getElementByTag('monlien').href = ajaxPost("fichier_cible.php", "monlien", "param1=blabla&param2=blabla2");
    //Simulation du click sur le lien
    simuleClick('monlien');
    // à la fin on supprime le lien de la page ni vu, ni connu
    removeElement('monlien') ;
}

//Sert à supprimer un élément d'une page grâce à son id

function removeElement(id) {
  var element = document.getElementById(id);
  element.parentNode.removeChild(element);
}

 
</script>

</body>
</html>

Re: Download File avec Ajax

par jeeday » 20 déc. 2014, 01:32

L'Iframe pouvant entrer en conflit avec les autres éléments de la page, je préconise cette solution
Vous pouvez tout simplement procéder comme cela :

1 - créer une requete ajax qui récupère le lien de téléchargement en texte

Voici le code pour créer une fonction ajax qui vous renvoi le contenu
[javascript]
function getXMLHttpRequest()
{
var xhr = null; // On déclare une variable xhr à null

if (window.XMLHttpRequest || window.ActiveXObject)// Teste prise en charge des XMLHttpRequest
{
if (window.ActiveXObject) /*Si Internet Explorer alors on utilise les ActiveX*/
{
try /*On teste IE7 ou supérieur*/
{
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)/*Si une erreur est levée, alors c'est IE 6 ou inférieur*/
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else /*Navigateurs récents(Firefox, Opéra, Chrome, Safari, ...)*/
{
xhr = new XMLHttpRequest();
}
}
else
{
alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
return null;
}
return xhr; // On retourne l'objet xhr
}

/* -- Envoi de données vers un fichier avec Ajax -- */

function ajaxPost(url,idDiv,donnees)//url : emplacement du fichier cible | donnees : envoi sous forme var1=donnee1&var2=donnee2&var3=donnee3
{
var xhr = getXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0))
{
//Retourner le contenu
return xhr.responseText;
}
}
xhr.open("POST", url, true);/*On ouvre une connexion en méthode POST vers url*/
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(donnees); /*permet l'encodage des POST*/
}
[/javascript]

2 - Ajouter toujours au même code une fonction qui simule un click sur un élément (cet élément est notre lien)

[javascript]
function simuleClick(idBtn)
{
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
document.getElementById(idBtn).dispatchEvent(evt);
}

[/javascript]

3 - Puis le code JS créer un nouvel élément dans la page avec un id précis (cet élément est dans notre cas un lien) et simule le click sur cet élément.

[javascript]
//Créer un lien dans la page -> envoi une requête qui délivre le contenu du lien crée -> simule un clique sur ce lien -> puis supprime ce lien.
function creerLienEtCliquer(idDiv,question)
{
//Créer le lien avant la fermeture de la balise body invisible (grâce à style="visibility:hidden;")
document.getElementByTag('body').innerHTML += '<a id ="monlien" href="" style="visibility:hidden;">lien_download</a>';
//Envoi une requête ajax et remplis l'attribut "href" du nouveau lien crée avec le contenu reçu (le lien de téléchargement)
document.getElementByTag('monlien').href = ajaxPost("fichier_cible.php", "monlien", "param1=blabla&param2='+question+'");
//Simulation du click sur le lien
simuleClick(idBtn);
// à la fin on supprime le lien de la page ni vu, ni connu
function removeElement('monlien') ;
}

//Sert à supprimer un élément d'une page grâce à son id

function removeElement(id) {
var element = document.getElementById(id);
element.parentNode.removeChild(element);
}

[/javascript]

Cela prend deux secondes à installer et peut fonctionner sous tous type de navigateur.

Contact sur http://www.siapep.fr

Re: Download File avec Ajax

par yassine » 28 mars 2014, 16:50

jax

Re: Download File avec Ajax

par Yosh » 17 mars 2010, 13:59

au clic droit.

si il veux que ça charge suite à un click droit c'est que le "click gauche" est utilisé à autre chose ...et donc tu ne peux pas utiliser de <a> !...

je me suis fait eu aussi :oops:
Le clic gauche pour un des élément de mon Menu...et cela sans rechargement de page.

Re: Download File avec Ajax

par stealth35 » 17 mars 2010, 12:27

au clic droit.

si il veux que ça charge suite à un click droit c'est que le "click gauche" est utilisé à autre chose ...et donc tu ne peux pas utiliser de <a> !...

je me suis fait eu aussi :oops:
il a dit que c'était un menu contextuel au click droit, mais le clique droit c'est pour afficher le menu, clique gauche pour ouvrir le lien du menu
un peu comme ca : http://dojocampus.org/explorer/#Dijit_Menu_Popup%201

Re: Download File avec Ajax

par Nours312 » 17 mars 2010, 12:18

au clic droit.

si il veux que ça charge suite à un click droit c'est que le "click gauche" est utilisé à autre chose ...et donc tu ne peux pas utiliser de <a> !...

je me suis fait eu aussi :oops:

Re: Download File avec Ajax

par stealth35 » 17 mars 2010, 11:16

je vois toujours pas, fraudais que tu me montre, parce que un lien <a> avec le force download derrière ca t'ouvre direct la fenêtre de download du client
au depart je croyais que tu voulais faire du "Download File avec Ajax" donc télécharger un fichier via ajax (sans passer par le ouvrir ou enregister sous et compagnie) pour que ca aille sur la machine client

Re: Download File avec Ajax

par Yosh » 17 mars 2010, 09:52

oups, désolé, ... tu as aussi window.open() mais ta réponse sera : "ben non, vu que 75% des utilisateurs bloquent les popUp ^^ " ...
Et vu que window.location = href risque fort de fermer la fenêtre ... Ben, j'ai perdu une occasion de me taire ... :D
Non non pas de soucis.

Re: Download File avec Ajax

par Nours312 » 17 mars 2010, 01:16

oups, désolé, ... tu as aussi window.open() mais ta réponse sera : "ben non, vu que 75% des utilisateurs bloquent les popUp ^^ " ...
Et vu que window.location = href risque fort de fermer la fenêtre ... Ben, j'ai perdu une occasion de me taire ... :D

Re: Download File avec Ajax

par Yosh » 17 mars 2010, 00:05

et un simple <a href="ajax/download.php?.... " target="_blank" > click ici</a> ne convenait pas !?
Ba non vu que toutes les fonctionnalités devait être présentés dans un menu au clic droit...sinon je me serais effectivement pas pris la tête.

Re: Download File avec Ajax

par Nours312 » 16 mars 2010, 22:46

et un simple <a href="ajax/download.php?.... " target="_blank" > click ici</a> ne convenait pas !?

Re: Download File avec Ajax

par Yosh » 16 mars 2010, 19:40

aucun rapport avec AJAX, c'était quoi ton problème à la base ?
Je devais donner la possibilité via un context menu (via un clic droit) de télécharger, imprimer et envoyer par mail un document dans une liste de document tiré de la GED de notre ERP...

Re: Download File avec Ajax

par stealth35 » 16 mars 2010, 18:03

aucun rapport avec AJAX, c'était quoi ton problème à la base ?

Re: Download File avec Ajax

par Yosh » 16 mars 2010, 17:58

ca sert a quoi ? :shock:
Récupérer des fichiers distants en UNC

Re: Download File avec Ajax

par stealth35 » 16 mars 2010, 17:23

ca sert a quoi ? :shock: