如何创建不需要右键单击的PDF下载链接?

Mos*_*she 3 html javascript php download web

我正在一个访问者应该能够下载pdf文件的网站上工作.(有三个链接可供选择,但这是无关紧要的)我想知道如何制作它,以便访问者只需点击链接而不必

right click > Save (target) As...
Run Code Online (Sandbox Code Playgroud)

我对PHP和/或Javascript解决方案持开放态度.谢谢.

编辑:我可以使用JavaScript来调用PHP并通过AJAX保存文件吗?

EDIT2:我最后使用了Nirmal的解决方案,因为对于所有三个文件来说,它是最简单的.我不需要为三个PDF制作3个文件,我也不需要手动编码开关.BalusC得到了检查,因为他/她的代码首先出现并且也做了伎俩.

Bal*_*usC 13

您基本上需要做的就是设置Content-Disposition标题attachment以获得"另存为"对话框.这是启动PHP示例:

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

你不能也不想用Javascript做这件事.

重要提示:由于功能较差,在MSIE中,"另存为"对话框中的默认文件名不会从content-disposition标题中派生出来,而是请求URL中pathinfo的最后一部分.要解决此问题,请将PDF文件名附加到链接,例如http://example.com/pdf/foo.pdf.您甚至可以在PHP中使用它来读取pathinfo指定的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');
    }
?>
Run Code Online (Sandbox Code Playgroud)

然而,这假设你已经MultiViews上,这样/pdf/会通过这个PHP文件,或至少是RewriteRule/pdf//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');
    }
?>
Run Code Online (Sandbox Code Playgroud)

将其命名为files.php左右,然后你有一个通用的PHP下载,你可以例如访问由http://example.com/files/foo.pdf,http://example.com/files/bar.zip,等等.

希望这可以帮助.