Ссылка для скачивания
Иногда передо мной стоит задача сделать ссылку, которая должна открывать системный диалог для сохранения файла. Браузеры достаточно умны, чтобы открывать такой диалог при скачивании бинарников вроде архивов или EXE-файлов. Но что делать, если я хочу скачивать картинки или какие-нибудь видео? Именно скачивать, не открывать для просмотра.
Заголовок Content-Disposition Скопировать ссылку
Самый правильный способ попросить браузер скачать файл — добавить на стороне сервера заголовок Content-Disposition к потоку с файлом.
Content-Disposition: attachment; filename=kitten.jpg
Когда браузер видит у заголовка значение attachment , то пытается скачать файл.
Но иногда у вас просто нет возможности настроить сервер под свои нужды и добавить ещё один mod_rewrite . Нужен какой-то более браузерный способ решить задачу.
Атрибут download Скопировать ссылку
Самый простой способ — добавить атрибут download к ссылке.
Если вы добавите его просто так, без значения, браузер постарается получить имя файла либо из заголовка Content-Disposition (опять он, и у него довольно высокий приоритет), либо из пути файла.
Но вы можете задать значение атрибуту download , и тогда это значение станет именем скачиваемого файла. Это может быть полезно, если у ваших файлов какие-нибудь странные автогенерируемые урлы вроде https://cdn/images/a1H5-st42-Av1f-rUles .
Важно! Вся эта магия атрибутов не для ссылок с других доменов (cross-origin). Вы не можете управлять чужими ресурсами из соображений безопасности.
И помните, что IE и старые Safari не понимают атрибут download . Проверьте в Can I use….
blob: и data: Скопировать ссылку
Полезный лайфхак, чтобы помочь вашим пользователям сохранять картинки котиков в удобном для них формате. Если вы на своём сайте используете картинки в форматах AVIF или WebP, есть очень высокая вероятность, что ни один пользователь не сможет сохранить их к себе на компьютер или смартфон, чтобы потом пересмотреть. Точнее, сохранить-то смогут, а вот посмотреть вне браузера не смогут. Печаль.
Чтобы помочь пользователям, используйте data: или blob: внутри атрибута href .
Шаг 1. Нарисуйте картинку на Canvas Скопировать ссылку
const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); const image = new Image(); image.onload = function () < context.drawImage(image, 0, 0); // TODO: всю магию намазывать сюда >; image.src = 'kitten-170.avif';
Шаг 2а. Сохранить картинку как блоб в атрибут href ссылки Скопировать ссылку
const blobLink = document.getElementById('blob-link'); canvas.toBlob(blob => < const blobUrl = URL.createObjectURL(blob); blobLink.href = blobUrl; >, 'image/jpeg', 0.9);
Да-да, я могу сохранить AVIF как JPEG. Классно, правда? Пользователь скачал всего 4 КБ AVIF с сервера, а получил 13 КБ JPEG на клиенте!
Шаг 2б. Сохранить картинку как data в атрибут href ссылки. Скопировать ссылку
Некоторые браузеры не умеют работать с блобами, поэтому вы можете помочь им при помощи data-урлов.
const dataLink = document.getElementById('data-link'); dataLink.href = canvas.toDataURL('image/jpeg', 0.9);
Так даже проще, но такой подход хуже по производительности.
Можете поиграть с полным демо тут:
Источники Скопировать ссылку
- Wiki: Content-Disposition
- MDN: The Anchor element
- MDN: canvas.toDataURL
- MDN: canvas.toBlob
Скачать и сохранить файл по ссылке
есть сайт http://omc.univ.kiev.ua/ru/studentu-i-vykladachu/rozklad-zanyat/ , самая последняя ссылка — замены — http://omc.univ.kiev.ua/wp-content/uploads/2019/03/%D0%B7%D0%B0%D0%BC%D1%96%D0%BD%D0%B8-25.03-29.03-5.xls Я хочу чтобы мой телеграм бот по запросу отправлял файл, но проблема в том что я не знаю как мне автоматизировать этот процесс, ведь файл обновляется каждую неделю, а эта ссылка (замены) ведет на скачивание файла, тоесть она тоже обновляется. Может кто-нибудь подсказать идеи?))
Отслеживать
задан 30 мар 2019 в 19:45
1 1 1 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Я бы предложил раз в день(час/полчаса/10 минут, как посчитаете нужным) выкачивать родительскую страницу, и из неё парсить актуальную ссылку. Существует много библиотек для парсинга HTML-страниц, например, jsoup.
Причём, логично было бы обновлять ссылку на файл, только когда это нужно. То есть, получая запрос от бота, мы проверяем, актуальна ли ссылка (прошёл ли уже день/час/полчаса с её создания). Если да, то парсим новую. Если нет, то возвращаем текущую. Таким образом, ссылки не будут получаться вхолостую, когда запросов к боту нет.
Описанный выше алгоритм стремится оптимизировать количество запросов, которые делает ваше приложение, но, при низких нагрузках, можно сделать гораздо проще, и просто получать свежую ссылку каждый раз без всяких сроков действия.
Делаем возможной скачивание файлов с сайтов, сделанных на Тильде (Тильда + Google Диск)


Загрузить файл прямо в Тильду не получится. Если вы начнете искать, как загрузить файл на сайт, сделанный на Тильде, то чаще встретите такой ответ.
Ок, идем в Google Drive и сталкиваемся с другой проблемой
Проблема 2
В гугле при шере файла появляется ссылка такого вида:
https://drive.google.com/file/d/1UlIyZidKw-RLScN6hxxIhni1AX9xAUtW/view?usp=sharing
Если мы вставим ее в кнопку «Скачать логотип WAVE» то при клике файл открывается на новой странице. Да, его можно скачать уже с этой страницы, но все равно это лишнее действие и ссылка открывается на странице гугла.
Решение

Решили сделать прямую ссылку, минуя страницу Google Drive. Нам понадобится вот эта часть из адреса, идентификатор файла
Копируем и вставляем в новую ссылку:
https://drive.google.com/uc?export=download&id=
✅ Готово
Теперь у нас есть ссылка для кнопки, чтобы загрузка файла начиналась автоматически. Попробуйте скачать логотип WAVE
Скачивание файлов из Интернета с использованием Python
В современном мире часто возникает необходимость скачивания файлов из интернета. Существует множество инструментов и библиотек, которые позволяют это делать, однако они могут быть сложными для новичков и тех, кто только начинает изучать язык Python. В этой статье будет показан простой и эффективный способ скачивания файлов из Интернета с использованием Python.
Допустим, существует задача скачивания mp3-файла с некоторого сайта. Это может быть необходимо для создания подкаста или сбора музыкальной коллекции. Обычно такие задачи решаются с помощью специализированных утилит, однако они могут быть неудобными в использовании или требовать установки дополнительного программного обеспечения. Вместо этого можно использовать Python, который предоставляет высокоуровневые библиотеки для работы с сетью и файлами.
Одной из таких библиотек является requests . Она предоставляет простой в использовании интерфейс для отправки HTTP-запросов и обработки ответов. Для скачивания файла можно использовать метод get() , который отправляет GET-запрос на указанный URL и возвращает ответ сервера. Затем полученные данные можно записать в файл с помощью стандартных средств Python.
Вот простой пример кода, который скачивает mp3-файл по URL:
import requests url = 'http://example.com/song.mp3' response = requests.get(url) with open('song.mp3', 'wb') as file: file.write(response.content)
В этом коде сначала импортируется библиотека requests , затем задается URL mp3-файла. Далее отправляется GET-запрос на этот URL и получается ответ сервера. Затем открывается файл song.mp3 на запись в двоичном режиме, и в него записывается содержимое ответа сервера.
Таким образом, скачивание файлов из Интернета с использованием Python является простой и эффективной задачей, которую можно легко решить с помощью библиотеки requests .