Я даю ссылку на файл pdf на моей веб-странице для загрузки, например ниже
<a href="myfile.pdf">Download Brochure</a>
Проблема заключается в том, когда пользователь нажимает на эту ссылку, тогда
Но я хочу, чтобы он всегда загружался пользователю для загрузки, независимо от того, установлен ли «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"