Selon caniuse l'attribut download
de <a>
l'élément est pris en charge dans Microsoft Edge build 10547 + , mais pas IE ou Safari .
Comment télécharger un objet fichier sans utiliser <a>
élément avec download
jeu d'attributs ou un serveur?
Il existe plusieurs façons de déclencher un téléchargement. Voici quelques exemples:
Utilisez un formulaire:
<form method="get" action="mydoc.doc">
<button type="submit">Download</button>
</form>
Utilisez javascript:
<button type="submit" onclick="window.open('mydoc.doc')">Download</button>
Bien que je soutienne la réponse de @ LeoFarmer, je voudrais proposer deux approches "piratables":
Si le fichier est très petit, vous pouvez utiliser a
avec le href='data:[<mediatype>][;base64],<data>'
.
Cela pourrait vous permettre d'ajouter une disposition de contenu dans le mediatype
, en émulant un en-tête HTTP. Ce hack n'est pas aussi portable que l'on pourrait espérer.
Sur les fichiers petits à moyens, il est possible de télécharger le fichier en utilisant AJAX, puis tilisez l'API Javascript File pour demander l'enregistrement du fichier (l'API ne prend pas en charge l'enregistrement, mais il est facile de convertir les données vers une URL de données).
Si vous voulez éviter l'API Javascript File, vous pouvez essayer d'émuler un clic d'ancrage, comme suggéré ici .
Encore une fois, comme l'a souligné Leo Farmer, ces solutions ne peuvent pas promettre que le navigateur n'ouvrira pas le fichier dans un nouvel onglet au lieu de l'enregistrer sur le disque, mais je pense qu'il est prudent de dire que tous les utilisateurs pourront se dégradent gracieusement en cmd+S
ou ctrl+S
raccourci clavier :-)
Vous pouvez le faire en utilisant à la fois l'attribut de téléchargement et jquery. l'attribut de téléchargement ne prend pas en charge ie et safari/ios. Vous pouvez donc utiliser jquery pour ce faire
$('.download').click(function(e) {
e.preventDefault(); //stop the browser from following
window.location.href = 'uploads/file.doc';
});
<a href="no-script.html" class="download">Download</a>
Utilisez FileSaver.js
Il prend en charge tous les navigateurs couramment utilisés.
Il suffit d'inclure:
<script type="text/javascript" src="FileSaver.min.js"></script>
et utilisez-le comme:
var file = new File(["Hello, world!"], "hello world.txt", {type: "text/plain;charset=utf-8"});
saveAs(file);
Remarque: Pour le faire fonctionner également dans Safari <6, Opera <15 et FireFox <20, vous devez inclure Blob.js comme dépendance.
Vous pouvez utiliser data URI
data:[<mediatype>][;base64],<data>
Représentation du fichier créé manuellement ou en utilisant FileReader()
, .readAsDataURL()
, avec MIME
type défini sur application/octet-stream
, encodeURIComponent()
, window.open()
<script>
var file = "data:application/octet-stream,"
+ encodeURIComponent("<!DOCTYPE html>"
+ "<html><body>"
+ "<div>abc</div>"
+ "</body></html>");
var saveFile = window.open(file, "_self");
</script>
<script>
var blob = new Blob(["abc"], {type:"text/plain"});
var reader = new FileReader();
reader.addEventListener("load", function(e) {
// replace existing `MIME` type with `application/octet-stream`
var file = "data:application/octet-stream;"
+ e.target.result.split(/;/)[1];
var saveFile = window.open(file, "_self");
});
reader.readAsDataURL(blob)
</script>