Показать изображение, которое возвращает HTTP 503 в Firefox - PullRequest
6 голосов
/ 10 июля 2020

У меня есть изображение значка состояния, которое возвращает HTTP-код 503, когда соответствующая служба отключена (но веб-сервер все еще обслуживает вызовы). Теперь при открытии URL-адреса изображения изображение будет отображаться правильно, независимо от основного кода ошибки 503. Но использование его внутри тега <img> показывает значок сломанного изображения. Как я могу предотвратить это, все еще позволяя самому изображению возвращать 503? (Внешние службы зависят от этого)

Вот несколько снимков экрана, чтобы проиллюстрировать, что происходит:

Значок на странице: The badge on the page

The status message in the developer console:
The status message in the developer console

The badge itself:
Сам значок

Примечание: это происходит на Firefox. Не Chrome

Редактировать: Вот несколько запрошенных сведений:

  • Firefox 78.0.2 (64-бит)
  • Это обслуживается из того же домена. Но домен, по сути, просто проксирует несколько базовых веб-сервисов. И этот значок исходит из другой службы, но все в одном домене.
  • Это изображение SVG, если это имеет значение.

Ответы [ 2 ]

2 голосов
/ 21 июля 2020

Поскольку XMLHttpRequest может получить вывод любого запроса, независимо от кода ответа, можно запросить изображение с помощью XMLHttpRequest, а затем преобразовать тип ответа большого двоичного объекта в изображение формата base64, которое можно загрузить в браузер. .

Прокси-сервер CORS, который я использовал в примере кода, может не понадобиться в большинстве случаев, но может быть полезен в случае, когда изображение, которое вы пытаетесь отобразить, имеет странные заголовки ответа, которые предотвращают доступ к изображение из другого домена.

Вот пример кода. Он должен работать независимо от кода ответа, CORS и т. Д. c.

var xhr = new XMLHttpRequest();

xhr.onload = function () {
    var reader = new FileReader();
    reader.onloadend = function () {
        // here, reader.result contains the base64-formatted string you can use to set the src attribute with
        document.getElementsByTagName('img')[0].src = reader.result; // sets the first <img> tag to display the image, change to the element you want to use
    };
    reader.readAsDataURL(xhr.response);
};

xhr.open('GET', "https://cors-anywhere.herokuapp.com/i.stack.imgur.com/8wB1j.png"); // don't include the HTTP/HTTPS protocol in the url
xhr.responseType = 'blob';
xhr.setRequestHeader('X-Requested-With', 'xhr');
xhr.send();
<img src="about:blank">

Все работает, например, когда вы go в Inspect Element, вы видите, что атрибут src тега <img> указывает на URL-адрес base64 который можно загрузить в любом браузере.

0 голосов
/ 22 июля 2020

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

  • Попробуйте заменить SVG на PNG или JPG
  • Также попробуйте для сайта, например https://tinypng.com/ для сжатия размера изображения

Это может сработать для вас

...