Download File avec Ajax

ViPHP
ViPHP | 5462 Messages

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

Mammouth du PHP | 568 Messages

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.

yassine
Invité n'ayant pas de compte PHPfrance

28 mars 2014, 16:50

jax

jeeday
Invité n'ayant pas de compte PHPfrance

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

jeeday
Invité n'ayant pas de compte PHPfrance

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>