Как сделать PDF-файл загружаемым в HTML-ссылке?

Я даю ссылку на pdf-файл на моей веб-странице для загрузки, как показано ниже

<a href="myfile.pdf">Download Brochure</a>

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

  • если пользователь установил Adobe Acrobat, то он открывает файл в том же окне браузера в Adobe Reader.
  • если Adobe Acrobat не установлен, то он всплывающее окно для пользователя для загрузки файла.

но я хочу, чтобы он всегда всплывал для пользователя для загрузки, независимо от "Adobe acrobat" установлен или нет.

Пожалуйста, скажите мне, как я могу это сделать?

12 ответов


вместо ссылки на .PDF-файл, вместо этого сделайте что-то вроде

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

который выводит пользовательский заголовок, открывает PDF (binary safe) и печатает данные в браузере пользователя, затем они могут Сохранить PDF, несмотря на настройки браузера. В pdf_server.PHP должен выглядеть так:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: и, очевидно, запустить некоторые проверки здравомыслия на переменную" файл", чтобы предотвратить людей от кражи файлов, таких как не принимать расширения файлов, запретить косые черты, добавить .pdf до значения


Это распространенная проблема, но мало кто знает, что есть простое решение HTML 5:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

здесь newfilename - предлагаемое имя файла для сохранения файла пользователем. Или он по умолчанию будет иметь имя файла на стороне сервера, если вы оставите его пустым, например:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

совместимость: я тестировал это на Firefox 21 и Iron, оба работали нормально. Он может не работать в HTML5-несовместимых или устаревших браузерах. Единственный браузер, который я тестировал, не заставлял загружать ТО ЕСТЬ...

проверьте совместимость здесь:http://caniuse.com/#feat=download


Не петли через каждую строку файла. Использовать функцию ReadFile вместо этого, его быстрее. Это вне сайта php: http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
    // header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

обязательно санируйте переменную get, так как кто-то может загрузить некоторые файлы php...


вместо использования PHP-скрипта для чтения и очистки файла, более аккуратно переписать заголовок с помощью .htaccess. Это сохранит" хороший " URL (myfile.pdf вместо download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

Я нашел способ сделать это с помощью простого старого HTML и JavaScript / jQuery, который деградирует изящно. Протестировано в IE7-10, Safari, Chrome и FF:

HTML для ссылки для скачивания:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

jQuery (чистый код JavaScript был бы более подробным), который имитирует нажатие на ссылку после небольшой задержки:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

чтобы сделать это более надежным, вы можете добавить обнаружение функций HTML5, и если его там нет, используйте window.open() открыть новое окно с файлом.


это ключ:

header("Content-Type: application/octet-stream");

Content-type application/x-pdf-документ или приложение / pdf отправляется при отправке PDF-файла. Adobe Reader обычно устанавливает обработчик для этого типа MIME, поэтому браузер передаст документ Adobe Reader при получении любого из типов mime PDF.


в HTML5 есть более простой способ: добавьте


Я знаю, что я очень поздно, чтобы ответить на это, но я нашел хак, чтобы сделать это в JavaScript.

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}

попробуйте это:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

код внутри pdf_server_with_path.php является:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

header("Content-Disposition: attachment; filename=" . Urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);

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

Если вы используете Apache, и может положить .файл htaccess в соответствующем каталоге вы можете использовать приведенный ниже код. Конечно, вы можете поместить это в httpd.и конф, если у вас есть к нему доступ.

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

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

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


Я решил мой, используя весь url-адрес PDF-файла (вместо того, чтобы просто поместить имя файла или местоположение в href): a href="домен . com / pdf / filename.PDF-файл"


в приложении Ruby on Rails (особенно с чем-то вроде драгоценного камня креветки и плагина Prawnto Rails) вы можете выполнить это немного проще, чем полный скрипт (как в предыдущем примере PHP).

в вашем контроллере:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

часть render: layout => false сообщает браузеру открыть "Вы хотите загрузить этот файл?"подскажите вместо того, чтобы пытаться отобразить PDF. Тогда вы сможете нормально ссылаться на файл: http://mysite.com/myawesomepdf.pdf