2017-10-11 15 views
0

J'essaie de produire un fichier texte à mes utilisateurs et le code ci-dessous fait parfaitement le travail dans tous les navigateurs sauf IE et Edge (dans ce dernier, je peux ' t contrôle le nom du fichier mais il est au moins produit).Impossible de servir un fichier à télécharger dans IE à partir d'Angular

emitFile(stage: any): void { 
    const blob = new Blob([stage.elaboration], { type: "text/csv" }); 
    const url = window.URL.createObjectURL(blob); 
    const anchor = document.createElement("a"); 
    anchor.href = url; 
    anchor.download = "ff-rocks-ie-sucks.txt"; 
    anchor.click(); 
} 

Il y a an open issue ticket à cet égard, mais il est daté de 18 mois en arrière et l'activité récente est plutôt non récente. Il semble que c'est un endroit où les espoirs viennent à mourir.

Je n'ai trouvé aucune solution de contournement raisonnable. Ceux que j'ai vus étaient non-fonctionnants ou ont inclus une suggestion (très sage mais infaisable) pour obtenir navigateurs décents pour l'amour du canard. Et je crois que c'était plus une faute de frappe qu'une référence d'oiseau.

Que faut-il faire à ce sujet?

+0

IE11 ne supporte pas l'attribut de téléchargement. Les résultats dans IE diffèrent lors de l'utilisation du fichier: protocol. ou localhost. –

+0

Et il n'y a pas de solution de contournement? J'espérais qu'il était possible de réaliser ** en quelque sorte **. Je suppose que je n'ai pas de chance ... S'il vous plaît postez-le comme une réponse afin qu'il puisse être accepté (involontairement). :) – DonkeyBanana

Répondre

1

Vous devriez essayer d'utiliser msSaveBlob() au lieu de l'attribut download.

emitFile(stage: any): void { 
    const blob = new Blob([stage.elaboration], { type: "text/csv" }); 
    windows.navigator.msSaveBlob(blob,"ff-rocks-ie-sucks.txt"); 
} 

Cela devrait fonctionner correctement pour IE et Edge.

EDIT: La solution complète pour IE, FF et Chrome serait comme ça:

emitFile(stage: any): void { 
    const blob = new Blob([stage.elaboration], { type: "text/csv" }); 
    if(window.navigator.msSaveOrOpenBlob) //IE & Edge 
    { 
    //msSaveBlob only available for IE & Edge 
    windows.navigator.msSaveBlob(blob,"ff-rocks-ie-sucks.txt"); 
    } 
    else //Chrome & FF 
    { 
    const url = window.URL.createObjectURL(blob); 
    const anchor = document.createElement("a"); 
    anchor.href = url; 
    anchor.download = "ff-rocks-ie-sucks.txt"; 
    document.body.appendChild(anchor); //For FF 
    anchor.click(); 
    //It's better to remove the elem 
    document.body.removeChild(anchor); 
    link.remove(); 
    } 
} 
+0

Suggérez-vous que la méthode 'emitFile' devrait reconnaître le navigateur dans lequel l'application est exécutée et réagir en conséquence? Ou y a-t-il un moyen d'appeler la bonne version en fonction d'un certain balisage? – DonkeyBanana

+0

Non, cette solution ne fonctionne que sur IE et Edge à cause de la fonction msSaveBlob. Vous devez ajouter une condition pour FF et Chrome: 'if (window.navigator.msSaveOrOpenBlob) // IE & Edge {} else {// Chrome & FF} ' –