Принудительно открывать всплывающее окно «Сохранить как ...», открытое по текстовой ссылке, щелкнуть PDF в HTML - PullRequest
156 голосов
/ 27 сентября 2010

У меня есть несколько каталогов PDF большого размера на моем веб-сайте, и мне нужно связать их по мере загрузки.Когда я гуглил, я обнаружил такую ​​вещь, отмеченную ниже.Он должен открыть всплывающее окно " Сохранить как ... " при нажатии ссылки ...

 <head>
    <meta name="content-disposition" content="inline; filename=filename.pdf">
    ...

Но это не работает: / Когда я ссылаюсь на файл, как показано ниже,он просто ссылается на файл и пытается открыть файл.

    <a href="filename.pdf" title="Filie Name">File name</a>

ОБНОВЛЕНИЕ (согласно ответам ниже):

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

Ответы [ 17 ]

238 голосов
/ 24 июня 2013

Из ответа на Заставить браузер сохранить файл, как после нажатия ссылки :

<a href="path/to/file" download>Click here to download</a>
77 голосов
/ 03 февраля 2014
<a href="file link" download target="_blank">Click here to download</a>

Это работает для меня в Firefox и Chrome.

33 голосов
/ 27 сентября 2010

Метатеги не являются надежным способом достижения этого результата.Как правило, вы даже не должны этого делать - пользователь / пользовательский агент должен решать, что делать с контентом, который вы предоставляете.Пользователь всегда может заставить свой браузер загрузить файл, если он хочет.

Если вы все еще хотите заставить браузер загрузить файл, измените заголовки HTTP напрямую.Вот пример кода PHP:

$path = "path/to/file.pdf";
$filename = "file.pdf";
header('Content-Transfer-Encoding: binary');  // For Gecko browsers mainly
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
header('Accept-Ranges: bytes');  // Allow support for download resume
header('Content-Length: ' . filesize($path));  // File size
header('Content-Encoding: none');
header('Content-Type: application/pdf');  // Change the mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $filename);  // Make the browser display the Save As dialog
readfile($path);  // This is necessary in order to get it to actually download the file, otherwise it will be 0Kb

Обратите внимание, что это всего лишь расширение протокола HTTP;некоторые браузеры могут игнорировать его в любом случае.

22 голосов
/ 17 октября 2013

У меня была такая же проблема, и я нашел решение, которое до сих пор прекрасно работало.Вы добавили следующий код в ваш .htaccess файл:

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

Он был получен с Принудительно загрузить файл вместо того, чтобы отображаться в браузере .

9 голосов
/ 31 января 2013

Я нашел очень простое решение для Firefox (работает только с относительным, а не с прямым href): add type="application/octet-stream":

<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>
5 голосов
/ 01 апреля 2015

Попробуйте добавить эту строку в ваш файл .htaccess.

AddType application/octet-stream .pdf

Надеюсь, это сработает, так как не зависит от браузера.

5 голосов
/ 27 сентября 2010

Как правило, это происходит, потому что некоторые настройки браузера или плагины напрямую открывают PDF в том же окне, как простая веб-страница.

Следующее может помочь вам.Я сделал это на PHP несколько лет назад.Но в настоящее время я не работаю на этой платформе.

<?php
    if (isset($_GET['file'])) {
        $file = $_GET['file'];
        if (file_exists($file) && is_readable($file) && preg_match('/\.pdf$/',$file)) {
            header('Content-type: application/pdf');
            header("Content-Disposition: attachment; filename=\"$file\"");
            readfile($file);
        }
    }
    else {
        header("HTTP/1.0 404 Not Found");
        echo "<h1>Error 404: File Not Found: <br /><em>$file</em></h1>";
    }
?>

Сохраните вышеизложенное как download.php .

Сохраните этот небольшой фрагмент как файл PHP где-товаш сервер, и вы можете использовать его для загрузки файла в браузере, а не для отображения напрямую.Если вы хотите обслуживать файлы, отличные от PDF, удалите или измените строку 5.

Вы можете использовать ее следующим образом:

Добавьте следующую ссылку в ваш файл HTML.

<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>

Ссылка от: Этот блог

4 голосов
/ 04 марта 2016

Просто введите следующий код в ваш файл .htaccess:

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

Или вы также можете сделать трюк с помощью JavaScript

element.setAttribute( 'download', whatever_string_you_want);
4 голосов
/ 05 января 2018

Я только что использовал это, но я не знаю, работает ли он во всех браузерах.

Он работает в Firefox:

<a href="myfile.pdf" download>Click to Download</a>
3 голосов
/ 02 марта 2015

Очень простой способ сделать это, если вам нужно принудительно загрузить одну ссылку на вашей странице, - это использовать атрибут загрузки HTML5 в href-ссылке.

См .: http://davidwalsh.name/download-attribute

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...