Как скачать файл по ссылке
Перейти к содержимому

Как скачать файл по ссылке

  • автор:

Ссыл­ка для ска­чи­ва­ния

Иногда передо мной стоит задача сделать ссылку, которая должна открывать системный диалог для сохранения файла. Браузеры достаточно умны, чтобы открывать такой диалог при скачивании бинарников вроде архивов или 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» то при клике файл открывается на новой странице. Да, его можно скачать уже с этой страницы, но все равно это лишнее действие и ссылка открывается на странице гугла.

Решение

Fragment link

Решили сделать прямую ссылку, минуя страницу 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 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *