强制打开"另存为..."弹出窗口打开文本链接单击HTML中的PDF

des*_*ing 162 html pdf download content-disposition meta-tags

我的网站上有一些大尺寸的PDF目录,我需要将它们作为下载链接.当我用Google搜索时,我发现下面有这样的事情.它应该在链接点击时打开" 另存为... "弹出窗口...

 <head>
    <meta name="content-disposition" content="inline; filename=filename.pdf">
    ...
Run Code Online (Sandbox Code Playgroud)

但它不起作用:/当我链接到如下文件时,它只链接到文件,并试图打开该文件.

    <a href="filename.pdf" title="Filie Name">File name</a>
Run Code Online (Sandbox Code Playgroud)

更新(根据以下答案):

我认为没有100%可靠的跨浏览器解决方案.可能最好的方法是使用下面列出的一个Web服务,并提供下载链接...

Ayu*_*pta 252

单击链接后强制浏览器保存文件的答案:

<a href="path/to/file" download>Click here to download</a>
Run Code Online (Sandbox Code Playgroud)

  • 在评论发布时,`download`属性仅限于Chrome,Firefox和Opera.即使最新版本的IE和Safari也不支持它.有关未来的支持:请查看http://caniuse.com/#feat=download! (15认同)
  • 这仅适用于同源链接,如https://caniuse.com/#feat=download中所述.如果您的链接是跨域的,那么您的唯一选择(目前)是将响应类型强制为"application/octet-stream",正如许多答案所示.如果您无权访问服务器,则可以尝试对其进行代理并手动设置响应标头. (6认同)
  • 在撰写此评论时,这在 Edge 中有效,并且似乎是阻止超链接 PDF 在 Edge 中打开 PDF 查看器的非常糟糕的尝试的唯一方法。 (2认同)

DrW*_*aky 78

<a href="file link" download target="_blank">Click here to download</a>
Run Code Online (Sandbox Code Playgroud)

它适用于Firefox和Chrome.

  • 对我来说,'target ="_ blank"`是必要的,因为`download`只是无法正确触发下载(Chrome) (3认同)
  • 它与目前的最佳答案完全相同,但是来自2013年的Ayush Gupta."target ="_ blank"`可能会使它更适用于非支持浏览器,但是PDF会在新的窗口/标签中打开,而不是而不是覆盖当前页面). (2认同)
  • 如果在`download`属性中给出一个字符串,它将用作文件名.我一直在用户脚本中使用它. (2认同)
  • 如果我错了,请纠正我,但下载不是“另存为”对话框。Doenload 和 target _blank 只是在新选项卡中打开文件。 (2认同)

Kar*_*nek 33

元标记不是实现此结果的可靠方法.通常,您甚至不应该这样做 - 应由用户/用户代理决定如何处理您提供的内容.用户可以随时强制他们的浏览器下载文件.

如果您仍想强制浏览器下载文件,请直接修改HTTP标头.这是一个PHP代码示例:

$path = "path/to/file.pdf";
$filename = "file.pdf";
header('Content-Transfer-Encoding: binary');  // For Gecko browsers mainly
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
header('Accept-Ranges: bytes');  // Allow support for download resume
header('Content-Length: ' . filesize($path));  // File size
header('Content-Encoding: none');
header('Content-Type: application/pdf');  // Change the mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $filename);  // Make the browser display the Save As dialog
readfile($path);  // This is necessary in order to get it to actually download the file, otherwise it will be 0Kb
Run Code Online (Sandbox Code Playgroud)

请注意,这只是HTTP协议的扩展; 有些浏览器可能会忽略它.

  • 在实践中,我相信这是广泛实施的. (4认同)
  • HTTP中不存在Content-Transfer-Encoding.内容编码:没有用. (3认同)

小智 22

我遇到了同样的问题,并找到了迄今为​​止效果很好的解决方案.您将以下代码放在您的.htaccess文件中:

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

它来自强制下载文件而不是在浏览器中显示.

  • 这很有效,因为我有一个特定的文档目录供下载.我省略了ForceType,只是让类型保持原样.我也不需要不区分大小写; 我的似乎已经不区分大小写了.我添加了一些额外的类型,包括旧的/新的Office扩展的optional-x:`<FilesMatch"\.(pdf | xlsx?| docx?)$">` (4认同)

Use*_*ser 9

我找到了一个非常简单的Firefox解决方案(仅适用于相对而不是直接href):添加type="application/octet-stream":

<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>
Run Code Online (Sandbox Code Playgroud)

  • Chrome OS 上的 @Martin Chrome 和 Linux 上的 Firefox。原来该文件需要是本地的才能使其工作。我的 href 是云存储的网址。 (2认同)

小智 7

我刚用过这个,但我不知道它是否适用于所有浏览器。

它适用于 Firefox:

<a href="myfile.pdf" download>Click to Download</a>
Run Code Online (Sandbox Code Playgroud)

  • 在[早期的答案](/sf/answers/2016738041/)中建议这样做,并提供更多背景信息。 (3认同)

小智 6

尝试将此行添加到.htaccess文件中.

AddType application/octet-stream .pdf
Run Code Online (Sandbox Code Playgroud)

我希望它能够工作,因为它独立于浏览器.


Ash*_*hay 5

通常它会发生,因为某些浏览器设置或插件直接在同一个窗口中打开PDF,就像一个简单的网页.

以下内容对您有所帮助.几年前我用PHP完成了它.但目前我还没有在那个平台上工作.

<?php
    if (isset($_GET['file'])) {
        $file = $_GET['file'];
        if (file_exists($file) && is_readable($file) && preg_match('/\.pdf$/',$file)) {
            header('Content-type: application/pdf');
            header("Content-Disposition: attachment; filename=\"$file\"");
            readfile($file);
        }
    }
    else {
        header("HTTP/1.0 404 Not Found");
        echo "<h1>Error 404: File Not Found: <br /><em>$file</em></h1>";
    }
?>
Run Code Online (Sandbox Code Playgroud)

将上面保存为download.php.

将这个小片段保存为服务器上的某个PHP文件,您可以使用它在浏览器中下载文件,而不是直接显示.如果要提供PDF以外的文件,请删除或编辑第5行.

您可以像这样使用它:

将以下链接添加到HTML文件中.

<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>
Run Code Online (Sandbox Code Playgroud)

参考来自:这个博客

  • 这似乎是一种很好的方式,可以将服务器上的每个文件提供给任何关注的人.例如,`download.php?file = database_password_file.php`. (6认同)

Mr.*_*gle 5

实现此目的的一种非常简单的方法,无需使用外部下载站点或修改标题等,只需创建一个包含 PDF 的 ZIP 文件,然后直接链接到 ZIP 文件。这将始终触发“保存/打开”对话框,并且人们仍然可以轻松地双击与 .zip 关联的程序启动的 PDF 窗口。

顺便说一句,好问题,我也在寻找答案,因为大多数浏览器嵌入的 PDF 插件需要很长时间才能显示任何内容(并且通常会在加载 PDF 时挂起浏览器)。

  • 糟糕的可用性。许多最终用户不知道如何处理 zip 文件。 (32认同)

man*_*706 5

只需将以下代码放入.htaccess文件中:

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf
Run Code Online (Sandbox Code Playgroud)

或者您也可以通过JavaScript来欺骗

element.setAttribute( 'download', whatever_string_you_want);
Run Code Online (Sandbox Code Playgroud)


sus*_*ani 0

如果您的浏览器中有知道如何打开 PDF 文件的插件,它将直接打开。就像图像和 HTML 内容一样。

因此,另一种方法是不在响应中发送您的 MIME 类型。这样浏览器将永远不知道哪个插件应该打开它。因此,它会给您一个保存/打开对话框。