Задать вопрос
@reter24

Как остаться на той же странице при скачивании файла?

Я сделал такое скачивание файлов с яндекса и мне надо чтобы с другого сайта при нажатии скачать остаался на этом же другом сайте, а не переходил на сайт скачивания файла.

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta name="referrer" content="no-referrer" />
</head>
<?php
 $base_url = 'https://cloud-api.yandex.net/v1/disk/public/resources/download?';

/**
 * Ссылка на файл YaDisk
 */
$link = 'https://disk.yandex.ru/d/nss0V2i2HPAX2w';


/**
 * Формирование API ссылки
 */
$final_url = $base_url . 'public_key=' . urlencode($link);

  $json = json_decode(file_get_contents($final_url));
    $linkFile = $json->href;

        echo '<script>document.location.href = "'.$linkFile.'";</script>';
        ?>
</html>
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой 8 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Вроде относительно правильный подход - создать ссылку с атрибутом download и вызвать по ней клик, типа такого:
const a = document.createElement('a');

a.href = url;
a.download = 'data.json';  // нужное имя файла
a.click();
Ответ написан
Комментировать
@rPman
По коду у вас открытие страницы делает браузер с помощью javascript.

Что бы ссылка скачивалась а не открывалась в браузере (исключение, специально настроенные в браузере типы файлов, например pdf по умолчанию в браузерах открывается, но это настраивается), то сервер при формировании ответа по этой ссылке в headers задать два заголовка Content-Type и Content-Disposition: attachment
header('Content-Type: application/xml');
header('Content-Disposition: attachment; filename=filename.xml');

в данном случае тип данных application/xml а имя файла filename.xml (оно будет предложено в диалоге сохранения)

Повторю, эти заголовки должны быть отданы сервером по ссылке (в твоем случае это $linkFile) и если то не ваш сервер то у вас мало вариантов, кроме как проксировать их через себя.

p.s. есть еще вариант, он подходит если файлы по ссылке не большие (влезают в оперативную память у клиента) и главное удаленный веб сервер не запрещает кросс запросы CORS то можно загрузить файл на javascript и отдать его как blob
fetch('https://example.com/test.xml')
  .then(r => r.blob())
  .then(blob => {
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'test.xml';
    a.click();
    URL.revokeObjectURL(url);
  });

кстати если файл в том же домене, то можно просто создать тег с атрибутом download, не используя blob

Вроде бы больше нет никаких способов, либо content-disposition либо формировать blob и тег a с атрибутом download
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы