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

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

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

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

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

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

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

Вместо того, чтобы ссылаться на файл .PDF, вместо этого сделайте что-то вроде

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

который выводит пользовательский заголовок, открывает PDF (двоичный сейф) и печатает данные в браузере пользователя, тогда они могут выбрать сохранение 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-несовместимыми или устаревшими браузерами. Единственный браузер, который я тестировал, который не принудительно загружал, – это IE …

Проверьте совместимость здесь: 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"); 

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

В HTML5 есть более простой способ: Добавить атрибут « Download .

Он поддерживается большинством современных браузеров.

 <a download href="file.pdf">Download PDF</a> 

Я знаю, что очень поздно ответить, но я нашел взломать это в javascript.

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

Это обычная проблема, но мало кто знает, что есть простое решение HTML 5: <a href="./directory/yourfile.pdf" download="filename">Download the pdf</a> }

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

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

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

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

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

<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.conf, если у вас есть доступ к этому.

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

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

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

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