Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.11.2021, 17:55
Новичок на форуме
Отправить личное сообщение для miha21 Посмотреть профиль Найти все сообщения от miha21
 
Регистрация: 01.11.2021
Сообщений: 5

<img src="script.php" /> в Firefox и Chrome
<img src="script.php" /> вызывает динамическое создание картинки сервером.

Содержимое файла script.php отдает браузеру картинку с заголовком:

header('Content-Type: image/png');
header("Content-Disposition: inline; filename=$example.png");

В результате в любом браузере видим картинку example.png.

В Firefox по правой кнопке мы сохраняем спокойно картинку с именем example.png, а в свежих версиях Chrome предпринимается неудачная попытка сохранить script.php, ранее Хром так себя не вел.

Не подскажете идею - как для Хрома изменить синтаксис <img src="script.php" /> чтобы при попытке сохранить по правой кнопке мыши динамическую картинку сохранялась именно картинка example.png, уже отданная скриптом php странице, а не предпринималась попытка сохранить серверный скрипт script.php.

Браузеру не надо второй раз обращаться к серверу при сохранении картинки из кеша. Первый раз браузер передает серверу информацию методом GET для отрисовки картинки, и это обращение корректное. При попытке сохраниться в Хроме скрипт уже ничего не отдает серверу, от того ошибка.

Как покрасивее решить эту коллизию?
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2021, 06:08
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

А почему скрипт второй раз ничего не отдаёт?
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2021, 14:20
Новичок на форуме
Отправить личное сообщение для miha21 Посмотреть профиль Найти все сообщения от miha21
 
Регистрация: 01.11.2021
Сообщений: 5

Потому что при нажатии правой кнопки и сохранить метод GET второй раз не отправляет задание скрипту. Может быть мне попробовать на событие по клику правой кнопки вновь формировать тот же GET-запрос?
Первый вызов картинки выглядит как script.php?и_тут_разные_GET-задания
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2021, 08:12
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Сообщение от miha21 Посмотреть сообщение
Может быть мне попробовать на событие по клику правой кнопки вновь формировать тот же GET-запрос?
Это не поможет.

Сообщение от miha21 Посмотреть сообщение
Потому что при нажатии правой кнопки и сохранить метод GET второй раз не отправляет задание скрипту.
Первый вызов картинки выглядит как script.php?и_тут_разные_GET-задания
Понятно. Да, в таком случае это явный косяк браузера. Попробуйте следующие варианты:

- при отдаче картинки выставлять HTTP-заголовки кэширования. Есть вероятность, что можно заставить браузер брать картинку из кэша при сохранении;

- попробуйте убрать заголовок 'header("Content-Disposition: inline; filename=$example.png");'. Вдруг без него браузер изменит своё поведение;

- если в качестве веб-сервера у вас apache, можно заменить параметры GET (всё, что после символа вопроса) на PATH_INFO (https://overcoder.net/q/45476/что-такое-pathinfo-в-php);

- если ничего не поможет, то остаётся самый надёжный способ - сделать GET-параметры частью файла или пути:
/path/to/param1=1/param2=2/script_param3=3_param4=4.php (знак '=' можно заменить на любой другой, например на '-')
и средствами веб-сервера направлять такие запросы на ваш скрипт.
Ответить с цитированием
  #5 (permalink)  
Старый 10.11.2021, 00:36
Новичок на форуме
Отправить личное сообщение для miha21 Посмотреть профиль Найти все сообщения от miha21
 
Регистрация: 01.11.2021
Сообщений: 5

Спасибо вам за советы! Второй вариант с убиранием заголовка с именем ни к чему не приводит, это как-то попробовал. Буду пробовать варианты 1,3,4. Особенно последний вариант мне кажется красивым, но про HTTP-заголовки кэширования изучу вначале.
Ответить с цитированием
  #6 (permalink)  
Старый 10.11.2021, 00:51
Новичок на форуме
Отправить личное сообщение для miha21 Посмотреть профиль Найти все сообщения от miha21
 
Регистрация: 01.11.2021
Сообщений: 5

Первый вариант про кеш:
header('Cache-Control: public, max-age=600');
По правой кнопке в Хроме - неудачная попытка сохранения скрипта, зато если нажать "Открыть картинку в новой вкладке" - из него спокойно картинка png уже сохраняется. Хоть что-то.
Понятно что вся эта сложная идея для того, чтобы не перегружая страницы - динамически менять на ней картинку по запросу к серверу. Но решение с открытием картинки в новой вкладке и не перегружает страницу, так что с некоторыми оговорками решение приемлемое.

Последний раз редактировалось miha21, 10.11.2021 в 00:57.
Ответить с цитированием
  #7 (permalink)  
Старый 10.11.2021, 07:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,701

Может проще считывать картинку отдельно, а потом подставлять ее в Img

Например

function setImg (img, url) {
fetch(url)
.then(res => res.blob())
.then(blob => img.src = window.URL.createObjectURL(blob))
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Атрибут selected не срабатывает в Chrome и полностью не работает в Firefox geroin47 (X)HTML/CSS 0 11.03.2020 20:09
Как стилизовать button, checkbox и select в Chrome как Firefox? Demath (X)HTML/CSS 1 06.05.2019 07:58
текстовые поля firefox vs chrome newobject Общие вопросы Javascript 1 13.07.2014 22:33
В Firefox не работает скрипт в отличии от Opera, Chrome, IE yanagas Javascript под браузер 2 06.08.2013 01:32
тег <audio> в Opera, Chrome, Firefox Magneto Javascript под браузер 12 25.11.2010 15:12