Могу ли я явно указать тип MIME в теге img

Я пытаюсь отобразить favicon.ico на веб-странице не как ярлык, а как образ в теле страницы. На нашем тестовом сервере в IE изображения не отображались, и мы узнали, что это было потому, что MIME-тип, настроенный на сервере для .ico тип файла image/vnd.microsoft.icon вместо image/x-icon.

теперь мы смогли перенастроить наш сервер и устранить проблему, но мне было интересно, можно ли указать, какой тип MIME использовать в <img> тег и переопределить параметры сервера для конкретного файла?

3 ответов


нет атрибута для указания типа носителя в img элемент. Если вы используете, например,object элемент вместо (это работает для изображений, но с некоторыми причудами), вы можете использовать type есть атрибут. Но его определение в HTML 4.01 говорит: "этот атрибут является необязательным, но рекомендуется, когда данные указаны, поскольку он позволяет агенту пользователя избегать загрузки информации для неподдерживаемых типов контента. Если значение этого атрибута отличается от HTTP Content-Type возвращаемый сервером при извлечении объекта приоритет имеет тип содержимого HTTP."В HTML5 CR это немного отличается, но дело все еще в том, что type атрибут не ожидается переопределить HTTP заголовки-совсем наоборот.


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

фон

я хотел использовать файлы, хранящиеся в моем Gitorious репозитории в тегах изображений HTML. Однако данные " raw " файла были помечены как text/plain сервером, который препятствовал отображению Internet Explorer их. Firefox и Chrome работали нормально, поэтому я предполагаю, что они должны игнорировать предоставленный тип MIME и выяснить фактический на основе данных изображения.

Проблема

вы не можете явно указать тип MIME для <img> - тег. Для один вещь, <img> теги не имеют :

"use strict";

// This function is called when any image tag fails to load.
function fixMIME()
{

  var img = this;

  // First of all, try to guess the MIME type based on the file extension.
  var mime;
  switch (img.src.toLowerCase().slice(-4))
  {
    case ".bmp":              mime = "bmp";     break;
    case ".gif":              mime = "gif";     break;
    case ".jpg": case "jpeg": mime = "jpeg";    break;
    case ".png": case "apng": mime = "png";     break;
    case ".svg": case "svgz": mime = "svg+xml"; break;
    case ".tif": case "tiff": mime = "tiff";    break;
    default: console.log("Unknown file extension: " + img.src); return;
  }
  console.log("Couldn't load " + img.src + "; retrying as image/" + mime);

  // Attempt to download the image data via an XMLHttpRequest.
  var xhr = new XMLHttpRequest();
  xhr.onload = function()
  {
    if (this.status != 200) { return console.log("FAILED: " + img.src); }
    // Blob > ArrayBuffer: http://stackoverflow.com/a/15981017/4200092
    var reader = new FileReader();
    reader.onload = function()
    {
      // TypedArray > Base64 text: http://stackoverflow.com/a/12713326/4200092
      var data = String.fromCharCode.apply(null, new Uint8Array(this.result));
      img.src = "data:image/" + mime + ";base64," + btoa(data);
    };
    reader.readAsArrayBuffer(this.response);
  };
  xhr.open("get", this.src, true);
  xhr.responseType = "blob";
  xhr.send();

}

// This callback happens after the DOCUMENT is loaded but before IMAGES are.
document.addEventListener("readystatechange", function() {
  if (document.readyState != "interactive") { return; }
  // Add an error handler callback to all image tags in the document.
  var t = document.getElementsByTagName("img");
  for (var i = 0; i < t.length; ++i) { t[i].addEventListener("error", fixMIME, false); }
}, false);

помните, что любой новая <img> теги, добавленные на страницу с помощью манипуляции DOM, не покрываются, поэтому вам нужно будет прикрепить слушателей к ним самостоятельно.

CORS

интересно отметить, что приведенный выше код вызывает как Firefox и Chrome жаловаться CORS при обработке недопустимых URL-адресов изображений:

Chrome:

XMLHttpRequest не удается загрузить http://www.google.com/notarealfile.png. Заголовок "Access-Control-Allow-Origin" отсутствует на запрашиваемом ресурсе. Таким образом, Origin 'null' не имеет доступа. Ответ имел код состояния HTTP 404.

Firefox:

Запрос Cross-Origin Заблокирован: Тот Же Источник Политика запрещает чтение удаленного ресурса по адресуhttp://www.google.com/notarealfile.png. Это можно исправить, переместив ресурс в тот же домен или включив CORS.

однако Internet Explorer 11, похоже, не заботится. Это работает довольно хорошо:

  • неправильные типы MIME отлично работают в Chrome / Firefox, поэтому нет XMLHttpRequest необходимо сделать.
  • неправильные типы MIME не будут работать в Internet Explorer, но XMLHttpRequest будет работать без проблем, связанных с CORS.

отказ от ответственности: правильно сделать, чтобы сервер отправил правильный тип MIME. Это довольно хакерский обходной путь, и я бы не рекомендовал его, если у вас действительно нет другого выбора.


Я пробовал в прошлом; однако, это всегда был мой опыт, что это должно быть настроено на сервере. Содержимое страниц должно всегда придерживаться стандартных типов файлов, чтобы избежать будущих проблем, таких как .формат PNG. ,GIF и .формат jpg. Только мои два цента. Надеюсь, это поможет.