Хром 65 блокирует перекрестное происхождение. Обходной путь на стороне клиента для принудительной загрузки?
Chrome 65 удалил поддержку атрибута download на якорных элементах с перекрестным началом hrefs:
Block cross-origin
Чтобы избежать того, что по сути является пользовательской перекрестной утечкой информации, Blink теперь будет игнорировать наличие атрибута загрузки на якорных элементах с перекрестными атрибутами происхождения. Обратите внимание, что это относится к
HTMLAnchorElement.downloadКак и к самой стихии.
Намерение удалить | Chromestatus Tracker | Chromium Bug
Это прерывает бессерверные загрузки (Для ресурсов кросс-происхождения). он также сломал кнопку сохранения изображения Reddit Enhancement Suite ( RES v5. 12. 0 исправил это, используя хром .downloads API (расширение теперь запрашивает ваше разрешение на Управление загрузками) .res-media-controls-download)
Есть ли обходной путь?
2 ответов:
Согласно обсуждению
blob:иdata:url-адреса не затрагиваются, поэтому вот обходной путь с использованиемfetchи капли.Загрузочный носитель на стороне клиента
function forceDownload(blob, filename) { var a = document.createElement('a'); a.download = filename; a.href = blob; a.click(); } // Current blob size limit is around 500MB for browsers function downloadResource(url, filename) { if (!filename) filename = url.split('\\').pop().split('/').pop(); fetch(url, { headers: new Headers({ 'Origin': location.origin }), mode: 'cors' }) .then(response => response.blob()) .then(blob => { let blobUrl = window.URL.createObjectURL(blob); forceDownload(blobUrl, filename); }) .catch(e => console.error(e)); } downloadResource('https://giant.gfycat.com/RemoteBlandBlackrussianterrier.webm');Однако fetch работает только на некоторых URL-адресах. Вы можете получить ошибку CORS:
Failed to load https://i.redd.it/l53mxu6n14o01.jpg: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://redditp.com' is therefore not allowed access.Существуют расширения, которые позволяют перехватывать и изменять или удалять заголовки безопасности веб-сайтов:
(но установка
Access-Control-Allow-Origin: *сломал YouTube для меня)Tampermonkey
Если ваш вариант использования-Tampermonkey, то
GM_download(details), GM_download(url, name)⚠ это бета-функция, и вы должны сначала установить режим загрузки: [Browser API ▾] в Tampermonkey Dashboard > настройки
function forceDownload(blob, filename) { var a = document.createElement('a'); a.download = filename; a.href = blob; a.click(); } // Current blob size limit is around 500MB for browsers function downloadResource(url, filename) { if (!filename) filename = url.split('\\').pop().split('/').pop(); fetch(url, { headers: new Headers({ 'Origin': location.origin }), mode: 'cors' }) .then(response => response.blob()) .then(blob => { let blobUrl = window.URL.createObjectURL(blob); forceDownload(blobUrl, filename); }) .catch(e => console.error(e)); } downloadResource('https://giant.gfycat.com/RemoteBlandBlackrussianterrier.webm');

Comments