Erreurs du schéma D'URI des données et D'Internet Explorer 9

j'ai un problème en utilisant le schéma d'url de données RFC 2397 avec les versions 6-9 D'IE. Mon exemple de code ci-dessous fonctionne sans problème avec les versions actuelles de Safari, FF, Opera et Chrome.

data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9aHR0cDovL2dvb2dsZS5jb20vIj4g

ou

data:text/html,%3Cmeta%20http-equiv%3D%22refresh%22%20content%3D%220%3Burl%3Dhttp%3A//google.com/%22%3E%20

si le code ci-dessus est collé dans presque n'importe quel navigateur à L'exclusion de IE, il naviguera vers google.com, en essayant avec IE il échoue avec l'erreur suivante.

la page Web ne peut pas être affichée

cause la plus probable:

  • certains contenus ou fichiers de cette page Web nécessitent un programme que vous n'avez pas installé.

Ce que vous pouvez essayer:

recherchez en ligne un programme que vous pouvez utiliser pour visualiser ce contenu web.

Tapez L'adresse.

lors de l'inspection de la source de la page de L'IE page d'erreur générée il y a un lien qui fait référence aux Associations de fichiers et aux protocoles.

Type De Protocole:

Description: UnKnown

Windows ne reconnaît pas ce protocole.

je me rends compte que l'utilisation des données: protocole n'est probablement pas la plus simple ou dans la plupart des cas la meilleure option, mais je dois l'utiliser pour ce projet particulier.

j'ai cherché partout une solution et essayé de nombreux exemples avec IE en espérant que c'était ma syntaxe mais j'ai encore trouvé une solution.

22
demandé sur Andy 2011-09-13 20:35:45

6 réponses

URIs de données ne peut pas être utilisé pour la navigation, pour le script, ou pour peupler les éléments de cadre ou iframe dans IE.

selon http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx :

les URIs de données ne sont pris en charge que pour les éléments et / ou attribut.

object (images only)
img
input type=image
link
CSS declarations that accept a URL, such as background, backgroundImage, and so on.

peut être imbriqué.

pour des raisons de sécurité, les URI de données sont limités aux données téléchargées ressources. les données URIs ne peuvent pas être utilisées pour la navigation , pour les scripts, ou pour peupler les éléments du cadre ou de l'iframe.

URIs de données ne peut pas dépasser 32 768 caractères.

les données de la ressource doivent être correctement encodées; sinon, une erreur se produit et la ressource n'est pas chargé. Le "#" et "%" caractères doivent être encodé, ainsi que le contrôle caractères, caractères ASCII non-US, et des caractères multioctets.

pour plus d'informations, voir RFC2397: le schéma D'URL" data".

disponible à partir de Windows Internet Explorer 8 ou plus tard.**

24
répondu DaveCS 2016-02-08 06:50:35

pour moi, trouver document.execCommand était un sauveur de vie. Il utilise le iFrame comme certains des autres exemples, mais le execCommand rend la fonctionnalité Save As cohérente.

voici un exemple

var getCsvFileForIE = function(target) {
  var csvData = target.attributes["data-csv"].value;
  if (navigator.appName === "Microsoft Internet Explorer") {
    csvData = decodeURIComponent(csvData);

    var iframe = document.getElementById('csvDownloadFrame');
    iframe = iframe.contentWindow || iframe.contentDocument;

    csvData = 'sep=,\r\n' + csvData;

    iframe.document.open("text/html", "replace");
    iframe.document.write(csvData);
    iframe.document.close();
    iframe.focus();
    iframe.document.execCommand('SaveAs', true, 'data.csv');
  } else {
    if (console && console.log) {
      console.log('Trying to call getCsvFileForIE with non IE browser.');
    }
  }
};

nous le faisons pour IE et pour tous les autres navigateurs nous utilisons le lien URI de données standard. Vous pouvez voir le "1519160920 complet" gist pour plus de détails. Une pointe de chapeau à Andrew Blondeau pour la direction .


mise à jour

une meilleure façon de déterminer si le navigateur supporte un URI de données

supportsDataUri = 'download' in document.createElement('a');

il semble aussi QU'IE rencontre toujours des problèmes. Pour IE10+ vous pourriez avoir besoin d'utiliser msSaveOrOpenBlob et pour IE8/9 Vous avez encore besoin de faire le execCommand dans un iFrame .

UPDATE 2

il y a un Modernizr issue pour détecter le schéma uri de données. Il fait référence à une autre réponse . Assurez-vous de vérifier ces.

16
répondu Snekse 2017-05-23 12:17:23

Internet Explorer does support Data URIs (la ressource est un peu dépassée). Il a cependant certaines considérations de sécurité qui l'empêchent de permettre des tentatives malveillantes pour rediriger les utilisateurs, ou autrement permettre aux pirates de s'engager dans le phishing sans exiger des scripts tiers ou des ressources hébergées.

cela signifie que vous pouvez L'utiliser avec JavaScript:

<script src="data:text/javascript;base64;YWxlcnQoIldvcmtzIik7"></script>

feuilles de Style en cascade (avec ou sans base64 encodage):

<link rel="stylesheet" href="data:text/css;base64,Ym9keXtjb2xvcjpncmVlbn0=">
<link rel="stylesheet" href="data:text/css,body%7Bcolor:green%7D">

ou même des images:

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QBgRXhpZgAASUkqAAg
AAAACADEBAgAHAAAAJgAAAGmHBAABAAAALgAAAAAAAABQaWNhc2EAAAMAAJAHAAQAAAAwMjIwAqAEAAE
AAAAbAAAAA6AEAAEAAAAbAAAAAAAAAP/bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwo
LCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQFBAUJBQUJFA0LDRQUFBUUFBQUFBQUDxQ
QFBUUExUVFBQUEBUUFQ4UFBQUEhISDxURFQ8SFRQSEBAQDQ8P/8AAEQgAGwAbAwERAAIRAQMRAf/EABg
AAAMBAQAAAAAAAAAAAAAAAAUHCAIG/8QAKxAAAQMDAwMDAwUAAAAAAAAAAQIDBAUGEQASIQciMQgTFEF
RgRVhcaHD/8QAGQEAAwEBAQAAAAAAAAAAAAAABAUGBwMC/8QALxEAAQMCAgcHBQEAAAAAAAAAAQACAwQ
RBSESMUFRYZHBEyJxobHR4RVDgfDxFP/aAAwDAQACEQMRAD8AGdeKdd3Um670bjz0waNQpzVKpVOWtSE
uqSgKefIztKipQwSOU4wRjuBq6tj52h2YTbA8Nkp6UmMaLzzS1sz0ru1qqNyrkrqWIiMrfjsjctw4HGT
wM/ngaEmxJjBaNqdRYPJpaczr8FTXRY1h7p9dVg1GpSZzNBkobYcec3qfgup9xjefqUqQ4n+ED651RYf
Utla2UjMKBx6hdTvdEw2ac7JR13psz+rytkUqTv8AITq1bVZDNZo6ncCQFYFH9O1vS+lVrOW1bD0REtl
uW8hi45Ty0hSAUkOrKlLyNvA27eBnCdZbUxNv3GjkFudDWvved55k9QpI9S0y7ujfqUk2jZ4bcaetuFP
MSSFyENrW84h1zevcvOEgZzj9hnQ76aAQh0+Wezw1JjR1dVPO5kJuNxJ360Stj1LU/ooqREuuA9Krs4s
LqM2A0lbDSACG0kDlRTlZKUjHJx5xplhjWui7mq+Xkk2PhxqgDrDRfxuUmL89awuO8KrUU202lDz3Z7K
vbSpIASlW3ZwSACR9ydUsc/ZtDBs4qLkw4TPMjjmeCGSurEun2rRqJBvStJq5U6iSiLUZHx0BKRtQ2pT
hJwPBASnggDxqUjDzdxBtx+PlaTpQEhha38DqegCM2PdL6apMrkyHKn1FuIiOuoyCpbiEA57nFLVkcnC
OAST4OgqqMygMLsr6lQUZigvIxlstdv3pdbqsGy7nn1ym3pcEy3am06hwvsKZMYtrYQUZK1pVu2r5SkK
APPGjIJXQQt7Jml/VJ4lCKmre50lj8JYVDopYQmu/GviZJYz2OtQS6lQ+4UlZB/B16+oz7YDzCB/wsH3
fJIx+W8qRKWXFbxIUQrPPCiB/QGmLNQQriS4lODo1Mk1/qBQaJUJcmVSXJrYXEW+v21dw8gHnQNaBHA6
Ros62tOaKV8kjY3OJbuWrXkya/wBV6z8ubMCn1y1OLjSnI61YXwNzaknaMDtzjgccDXKoPZUzdEDZsB9
UFGTJO7SO/wBV0kq3mRIcHzaue4+axLP+uk/bO3DkPZMxE3jzPuv/2Q==">

vous ne pouvez pas, cependant, utiliser ceux-ci avec window.open ou iframe , car ceux-ci permettraient certaines choses très dangereuses, y compris hameçonnage avec les données URIs :

<iframe src="data:text/html;base64,PGJ1dHRvbiBpZD0iX3BheXBhbCI+TG9nIGludG8gUGF5cG
FsPC9idXR0b24+DQo8c2NyaXB0Pg0KICAgIF9wYXlwYWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB
mdW5jdGlvbiAoKSB7DQogICAgICAgIGFsZXJ0KCJUaGlzIGNvdWxkIGhhdmUgYmVlbiB1Z2x5IGZvciB5
b3UuLi4iKTsNCiAgICB9LCBmYWxzZSk7DQo8L3NjcmlwdD4="></iframe>

ce dernier exemple aurait très bien pu être une réplique complète de L'écran de connexion PayPal. Au lieu de cela, c'est juste un bouton HTML avec un event-handler lié et d'écoute pour les clics. Des hackery semblables pourraient venir par le biais de window.open :

window.open("data:text/html;base64,PHN0cm9uZz5XQVQhPzwvc3Ryb25nPg==", "OHAI");

donc Internet Explorer 10 supporte cette fonctionnalité, mais elle protège l'utilisateur final de ceux qui l'utiliseraient malicieusement. Je suis sûr que Microsoft se fera un plaisir de lever cette restriction quand et s'ils déterminent une meilleure façon de protéger leur base d'utilisateurs.

Jusqu'à ce que les choses changent, vous devez trouver une autre façon d'inclure vos fichiers FLV. D'un autre côté, vous ne voudrez peut-être pas partager données réelles comme ceci de votre application sur le débordement de pile.

12
répondu Sampson 2013-11-13 16:31:26

selon la réponse de Franco ici: CSV File export For IE

il suffit de créer un objet Blob avec elle

//Save file
if (isMicrosoftIE()) {
    csvData = decodeURIComponent(csv);

    if(window.navigator.msSaveBlob){
        var blob = new Blob([csvData],{ type: "application/csv;charset=utf-8;"});
        navigator.msSaveBlob(blob, filename);
    }
}
else
{
    csvData = "data:application/csv;charset=utf-8," + encodeURIComponent(csv);
    $(this).attr({
        "href": csvData,
        "target": "_blank",
        "download": filename
    });
}

Et ça marche pour moi!

6
répondu abla 2015-08-26 07:15:05

deux solutions alternatives sont expliquées ici: http://sparecycles.wordpress.com/2012/03/08/inject-content-into-a-new-iframe/

la principale différence que je peux dire est que l'iframe a la même origine que la page d'origine, qui pourrait ne pas être désirée (Je ne suis pas sûr des implications de sécurité par exemple ce que le referer ou les cookies pourraient être pour les ressources chargées).

un exemple d'utilisation de la technique javascript: scheme est ici: http://jsbin.com/uhenuz/4 (S'il est utilisé avec https aurait besoin de googling supplémentaire et de bons tests pour vérifier que le mélange https/avertissement http ne peut jamais apparaître.)

0
répondu robocat 2013-07-01 02:56:33

je suis arrivé ici pendant que je cherchais un moyen de détecter la fonctionnalité pour le soutien d'uri de données de dossiers (PDFs dans mon cas). L'approche Modernizr de vérifier le soutien d'image n'était pas assez bon puisque Internet Explorer 11 et Edge 25 soutiennent que, mais ne supportent pas les types de fichiers comme application/pdf. L'approche de Snekse consistant à vérifier l'attribut de téléchargement a fonctionné sur IE mais pas sur Edge. Finalement, j'ai écrit mon propre script de détection de fonctionnalités en utilisant un appel AJAX pour essayer d'ouvrir un URI de données et de vérifier pour les erreurs. C'est le script que j'ai utilisé (testé dans IE 11, Edge 25, Firefox 46, et Chrome 49):

checkDataURISupport(function (checkResult) {
    if (checkResult) {
        alert('Files in data URIs are supported.');
    } else {
        alert('Files in data URIs are NOT supported.');
    }
})

function checkDataURISupport(callback) {
    try {
        var request = new XMLHttpRequest();
        request.onload = function reqListener() {
            callback(true);
        };
        request.onerror = function reqListener() {
            callback(false);
        };
        request.open('GET', 'data:application/pdf;base64,cw==');
        request.send();
    } catch (ex) {
        callback(false);
    }
}

mise à Jour

j'ai réalisé que n'importe quel code qui teste pour L'URI de données est iframe support teste aussi pour l'ouverture d'un URI de données dans une nouvelle fenêtre. Ainsi, la solution mentionnée dans cette réponse "so 151990920" et liée à la mise à jour de la réponse de Snekse est techniquement supérieure et je recommande l'utilisation il au lieu du code ci-dessus.

0
répondu Chris 2017-05-23 12:00:35