Ошибки данных URI и ошибки Internet Explorer 9

У меня возникла проблема с использованием схемы URL-адресов данных RFC 2397 с версиями IE 6-9. Мой пример кода работает без проблем при использовании текущих версий Safari, FF, Opera и Chrome.

data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9aHR0cDovL2dvb2dsZS5jb20vIj4g

или

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

Если вышеприведенный код вставлен почти в любой браузер, исключая IE, он будет перемещаться по адресу google.com при попытке с IE сбой при следующей ошибке.

Веб-страница не может быть отображена

Скорее всего, причина:

  • Некоторым контентом или файлами на этой веб-странице требуется программа, которую вы не установили.

Что вы можете попробовать:

Поиск в Интернете программы, которую вы можете использовать для просмотра этого веб-контента.

Введите адрес повторно.

При проверке источника страницы созданной страницы ошибки IE есть ссылка, которая ссылается на ассоциации файлов и протоколы.

Тип протокола:

Описание: UnKnown

Windows не распознает этот протокол.

Я понимаю, что использование данных: протокол, вероятно, не самый прямой или в большинстве случаев лучший вариант, но я должен использовать его для этого конкретного проекта.

Я искал все решения и пробовал много примеров с IE, надеясь, что это мой синтаксис, но все же нашел решение.

Ответ 1

URI данных нельзя использовать для навигации, для сценариев или для заполнения фреймов или элементов iframe в IE.

Согласно http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx:

URI данных поддерживаются только для следующих элементов и/или атрибуты.

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

URI данных могут быть вложенными.

По соображениям безопасности URI данных ограничены для загрузки Ресурсы. URI данных нельзя использовать для навигации, для сценариев или для заполнения кадров или элементов iframe.

URI данных не может быть больше 32 768 символов.

Данные ресурсов должны быть правильно закодированы; в противном случае возникает ошибка и ресурс не загружен. Символы "#" и "%" должны быть закодированные, а также управляющие символы, неамериканские символы ASCII и многобайтовые символы.

Для получения дополнительной информации см. RFC2397: Схема URL-адресов данных.

Доступно как в Windows Internet Explorer 8 или новее. **

Ответ 2

Для меня поиск document.execCommand был спасателем жизни. Он использует iFrame, как и некоторые другие примеры, но execCommand делает функциональность Save As последовательной.

Здесь пример

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.');
    }
  }
};

Мы делаем это для IE, и для всех других браузеров мы используем стандартную ссылку URI данных. Подробнее см. полный текст. Кончик шляпы Андрей Блондоу за направление.


UPDATE

Лучший способ определить, поддерживает ли браузер URI данных

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

Похоже, что IE все еще сталкивается с проблемами. Для IE10 + вам может понадобиться использовать msSaveOrOpenBlob, а для IE8/9 вам все равно нужно сделать execCommand в iFrame.

ОБНОВЛЕНИЕ 2

Существует функция проблема Modernizr для обнаружения схемы uri данных. Он ссылается на другой ответ SO. Не забудьте также проверить их.

Ответ 3

Internet Explorer поддерживает URI данных (ресурс немного устарел). В нем есть некоторые соображения безопасности, которые препятствуют тому, чтобы он позволял злоумышленным попыткам перенаправлять пользователей или иным образом позволял хакерам заниматься фишированием, не требуя сторонних скриптов или размещенных ресурсов.

Это означает, что вы можете использовать его с JavaScript:

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

Каскадные таблицы стилей (с кодировкой или без кодировки base64):

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

Или даже изображения:

<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==">

Однако вы не можете использовать их с window.open или iframe, так как это может привести к некоторым очень опасным вещам, включая Фишинг с URI данных:

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

Этот последний пример вполне мог быть полной версией экрана входа в систему PayPal. Вместо этого это просто кнопка HTML с привязкой к событиям и прослушивание кликов. Подобный хакер может прийти через window.open:

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

Таким образом, Internet Explorer 10 поддерживает эту функцию, но защищает конечного пользователя от тех, кто будет использовать его злонамеренно. Я уверен, что Microsoft с радостью поднимет это ограничение, когда и если он определит лучший способ защитить свою пользовательскую базу.

Пока все изменится, вам нужно найти другой способ включить ваши FLV файлы. С другой стороны, вы можете не захотеть передавать фактические данные из вашего приложения в Stack Overflow.

Ответ 4

По словам Франко, ответьте здесь: Экспорт файлов CSV для IE

Просто создайте с ним объект Blob

//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
    });
}

И это работает для меня!

Ответ 5

Здесь объясняются два альтернативных решения: http://sparecycles.wordpress.com/2012/03/08/inject-content-into-a-new-iframe/

Основное различие, которое я могу сказать, состоит в том, что iframe имеет то же происхождение, что и исходная страница, что может быть нежелательно (я не уверен в значениях безопасности, например, что референт или файлы cookie могут быть для загруженных ресурсов).

Пример использования метода javascript: schem здесь: http://jsbin.com/uhenuz/4 (Если использовать с https, потребуется дополнительный поиск в googling и хорошее тестирование для убедитесь, что смешанное предупреждение https/http никогда не появляется.)

Ответ 6

Я пришел сюда, пока искал способ обнаружения функции для поддержки файлов uri для данных (в моем случае это PDF файлы). Подход Modernizr к проверке поддержки изображений не был достаточно хорош, так как Internet Explorer 11 и Edge 25 поддерживают это, но не поддерживают такие типы файлов, как application/pdf. Подход Snekse к проверке атрибута загрузки работал на IE, но не на Edge. В конце концов, я написал собственное обнаружение функции script, используя вызов AJAX, чтобы попытаться открыть URI данных и проверить наличие ошибок. Это script, который я использовал (тестировался в IE 11, Edge 25, Firefox 46 и 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);
    }
}

Обновление

Я понял, что любой код, который тестирует URI данных, является поддержкой iframe, также тестирует поддержку открытия URI данных в новом окне. Таким образом, решение, упомянутое в этом SO-ответе и связанное с обновлением ответа Snekse, технически превосходно, и я бы рекомендовал использовать его вместо вышеуказанного кода.