Как сделать 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 при получении любого из типов PDF MIME.
Я знаю, что я очень поздно, чтобы ответить на этот вопрос, но я нашел хак, чтобы сделать это в 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.conf также, если у вас есть доступ к этому.
<FilesMatch "\.(?i:pdf)$"> Header set Content-Disposition attachment </FilesMatch>директива FilesMatch-это просто регулярное выражение, поэтому ее можно установить так же подробно, как вы хотите, или вы можете добавить другие добавочные номера.
строка заголовка делает то же самое, что и первая строка в скриптах PHP выше. Если вам также нужно установить строки типа контента, вы можете сделать это таким же образом, но я не нашел это необходимым.
Я решил мой, используя весь url-адрес PDF-файла (вместо того, чтобы просто поместить имя файла или местоположение в href): a href="домен . com / pdf / filename.PDF-файл"
в приложении Ruby on Rails (особенно с чем-то вроде Prawn gem и плагина Prawnto Rails) вы можете выполнить это немного проще, чем полный сценарий (например, предыдущий пример PHP).
в вашем контроллере:
def index respond_to do |format| format.html # Your HTML view format.pdf { render :layout => false } end endrender: layout = > false часть говорит браузеру, чтобы открыть "Вы хотели бы загрузить этот файл?"запрос вместо того, чтобы пытаться отобразить PDF. Тогда вы сможете нормально ссылаться на файл: http://mysite.com/myawesomepdf.pdf
Comments