Как создать ссылку для загрузки PDF-файла, для которой не требуется щелчок правой кнопкой мыши?

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

right click > Save (target) As... 

Я открыт для решений PHP и Javascript. Благодарю.

EDIT: могу ли я использовать javascript для вызова PHP и сохранения файла через AJAX?

EDIT2: В конце я использовал решение Nirmal, поскольку он был самым простым для всех трех файлов. Мне не нужно было делать 3 файла для трех PDF-файлов, и мне не нужно было передавать код коммутатору. BalusC получает чек, так как его / ее код был первым и делает трюк.

Все, что вам нужно сделать, это установить заголовок Content-Disposition в attachment чтобы получить диалог «Сохранить как». Вот пример PHP для начинающих:

 <?php header('Content-Type: application/pdf'); header('Content-Disposition: attachment;filename="foo.pdf"'); readfile('/path/to/foo.pdf'); ?> 

Вы не можете и не хотите делать это с помощью Javascript.

Важное замечание: из-за плохой функции в MSIE имя файла по умолчанию в диалоговом окне «Сохранить как» не будет выводиться из заголовка content-disposition , а вместо этого будет последней частью пути в URL-адресе запроса. Чтобы обойти это, добавьте имя файла PDF в ссылку, например http://example.com/pdf/foo.pdf . Вы даже можете использовать его в PHP для чтения в указанном PDF-файле с указанием пути. Вот основной пример pdf.php :

 <?php $file_name = $_SERVER['PATH_INFO']; $file = '/path/to/pdf/files' . $file_name; if (file_exists($file)) { header('Content-Type: application/pdf'); header('Content-Disposition: attachment;filename="' . basename($file_name) . '"'); header('Content-Length: ' . filesize($file)); readfile($file); } else { header('HTTP/1.1 404 Not Found'); } ?> 

Однако это предполагает, что у вас есть MultiViews так что /pdf/ будет проходить через этот файл PHP или, по крайней мере, RewriteRule из /pdf/ to /pdf.php/ .

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

Вы даже можете сделать его более общим, автоматически определяя и устанавливая правильный тип контента:

 <?php $file_name = $_SERVER['PATH_INFO']; $file = '/path/to/all/files' . $file_name; if (file_exists($file)) { header('Content-Type: ' . mime_content_type($file_name)); header('Content-Disposition: attachment;filename="' . basename($file_name) . '"'); header('Content-Length: ' . filesize($file)); readfile($file); } else { header('HTTP/1.1 404 Not Found'); } ?> 

Назовите его files.php или так, а затем у вас есть общий PHP-загрузчик, к которому вы можете получить доступ, например, http://example.com/files/foo.pdf , http://example.com/files/bar.zip , и так далее.

Надеюсь это поможет.

Вместо того, чтобы писать сценарии оболочки PHP, если вы используете Apache, вы можете сделать это с помощью файла .htaccess в папке, содержащей файлы PDF:

 <Files *.pdf> Header set Content-Disposition attachment </Files> 

По-видимому, некоторые версии IE / Adobe Reader не уважают заголовок Content-Disposition . Вы можете обойти их с ForceType application/octet-stream

 <Files *.pdf> ForceType application/octet-stream Header set Content-Disposition attachment </Files> 

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

Пример:

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

Однако это не поддерживается всем браузером. В соответствии с w3schools поддерживаются следующие браузеры:

Chrome (14+), Firefox (20+), Opera (15+).

Вы также можете указать имя файла, указав значение для загрузки attr:

 <a href="myfile.pdf" download="NewName.pdf">Download</a> 

Попробуйте использовать PHP для работы с файлом, сначала отправляя заголовок Content-type: application/octet-stream .

Вы можете добавить HTTP-заголовок, чтобы сделать это, есть пример в Документах PHP (см. Пример один)

Следующий код может помочь вам:

 <?php if(isset($_GET['docid'])){ switch($_GET['docid']){ case '1': $file = 'complete/path/to/pdf/file1'; break; case '2': $file = 'complete/path/to/pdf/file2'; break; case '3': $file = 'complete/path/to/pdf/file3'; break; default: exit; } if(file_exists($file)){ header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.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; } } 

Сохраните этот код как файл php (скажем, download.php) и позвоните ему по ссылке. Что делает скрипт, так это то, что он читает файл pdf и выводит его в буфер. Заголовки будут принудительно распределены как загрузка.

Чтобы вызвать первый pdf, href в '/path/to/download.php?docid=1'
Чтобы вызвать второй pdf, href для '/path/to/download.php?docid=2'
Чтобы позвонить третьему pdf, href в '/path/to/download.php?docid=3'

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