Créer un lien de téléchargement direct d'une image [Résolu]

- - Dernière réponse :  iKelSilver - 29 déc. 2018 à 03:37
Bonjour,
Je suis sur un projet qui me demande de créer un bouton de téléchargement d'une image depuis une base de données. Une fois l'utilisateur clique sur ce bouton, le téléchargement de l'image en question se lance automatiquement. Comment faire cela ?
J'ai trouvé le code suivant sur Google. Mais, après plusieurs tentatives et autres réponses que proposent d'autres site web, je ne suis pas toujours satisfaire.
Voici le code :
<a href="mon_image.jpg" download="IMG144144.jpg" target="_blank" >Télécharger</a>


Je veux qu'au clic sur < Télécharger >, le téléchargement de cette image cliquée démarre automatiquement.
Quelqu'un peut m'aider à faire cela ?

Merci
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
25627
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2019
311
1
Merci
Bonjour,

Tu peux forcer le navigateur à télécharger l'image en modifiant le header.

Pour ça, ton lien (contenant le nom de l'image en paramètre,
<a href="downloadImg.php?image=mon_image.jpg" target="_blank" >Télécharger</a>


pointe vers un fichier qui contient ceci :
<?php
/*
 * Fichier : downloadImg.php
 * Force le téléchargement du fichier
 * @image : paramètre envoyé via l'url en $_GET
*/

//récupération de l'image en paramètre
$file = !empty($_GET['image']) ? $_GET['image'] : NULL; 

//si l'image existe
if($file && file_exists($file)){
    header('Content-Type: application/force-download');
    header("Content-Transfer-Encoding: binary");
    header('Content-Disposition: attachment; filename='.basename($file));
    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();
}else{
    echo 'Le fichier n\'existe pas : '.realpath($file);
}

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Bonsoir Jordane45,
Merci pour la réponse. Mais, une inquiétude. Dans le lien
<a href="downloadImg.php?image=mon_image.jpg" target="_blank" >Télécharger</a>
Est-ce que je vais mettre seulement le nom de l'image ou plutôt le chemin complet de l'image ? Exemple :
<a href="downloadImg.php?image=http://www.monsite.com/photos/mon_image.jpg" target="_blank" >Télécharger</a>
Quand j'ai essayé les deux, je reçois bien la valeur de
$_GET
mais, par contre, le téléchargement n'est pas démarré.

Que je dois-je faire ?

Merci
jordane45
Messages postés
25627
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2019
311 > iKelSilver -
Il faut mettre le chemin vers l'image
L'url doit fonctionner aussi je pense.
Par contre, vu qu'il y a des slashes, essaye d'ajouter un urlencode http://php.net/manual/fr/function.urlencode.php
Ou au pire, un addSlashes (mais dans ce cas, il faudra surement un stripslashes à la récupération du get )

Essaye aussi le header
 header("Content-type: image/jpeg");  

à la place
header("Content-Transfer-Encoding: binary");
.
Merci Jordane45,
J'ai essayé mais sans succès. Voici ce que j'ai enfin trouvé et qui a résolu mon problème:
<script>


You can try this to force download an image.
However you cannot download something that is not on your domain, unless you are using a domain which accepts cross origin requests (Eg:Imgur)

You may use the 'download' attribute of HTML5 but still you won't be able to load in cross origin image.

Also the below method will support legacy browsers as well

function forceDownload(link){
    var url = link.getAttribute("data-href");
    var fileName = link.getAttribute("download");
    link.innerText = "Working...";
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "blob";
    xhr.onload = function(){
        var urlCreator = window.URL || window.webkitURL;
        var imageUrl = urlCreator.createObjectURL(this.response);
        var tag = document.createElement('a');
        tag.href = imageUrl;
        tag.download = fileName;
        document.body.appendChild(tag);
        tag.click();
        document.body.removeChild(tag);
        link.innerText="Download Image";
    }
    xhr.send();
}

</script>
<a href="#" data-href='https://i.imgur.com/Mc12OXx.png' download="Image.jpg" onclick='forceDownload(this)'>Download Image</a>


Merci beaucoup
Commenter la réponse de jordane45