如何在不离开 php 页面的情况下强制保存另存为对话框?

Posted

技术标签:

【中文标题】如何在不离开 php 页面的情况下强制保存另存为对话框?【英文标题】:How can I force a Save-As dialog box without leaving the page in php? 【发布时间】:2010-07-09 11:09:28 【问题描述】:

我有一个锚标签:

<a href="file.pdf">Download Me</a>

我希望用户单击它,然后出现一个“另存为”对话框,其中包含我确定的新文件名。

我找到了这个(http://www.w3schools.com/php/func_http_header.asp):

header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");
                                
// The PDF source is in file.pdf
readfile("file.pdf");

我不明白这些标题应该放在哪里。在页面顶部?当我尝试将这 3 行直接放在链接上方时,我收到以下错误:

警告:无法修改标题 信息 - 已发送的标头 (输出开始于 /home5/ideapale/public_html/amatorders_basic/admin/download.php:38) 在 /home5/ideapale/public_html/amatorders_basic/admin/download.php 在第 118 行

我刚刚添加的两个标题行都出现了相同的错误。紧接着,就有数千行 ASCII 字母。如何使用 jQuery 或 PHP(哪个更简单)显示“另存为”对话框?

【问题讨论】:

【参考方案1】:

在使用 Stijn Van Bael 的代码时请小心,它会让您面临一些严重的安全漏洞。

尝试类似:

--- download.php ---
$allowed_files = array('file.pdf', 'otherfile.pdf');

if (isset($_REQUEST['file']) && in_array($_REQUEST['file'], $allowed_files))

  $filename = $_REQUEST['file'];

  header("Content-type:application/pdf");
  header("Content-Disposition:attachment;filename='$filename'");

  // The PDF source is in file.pdf
  readfile($filename);

  exit();

else

  // error



--- linkpage.php ---
<a href="download.php?file=file.pdf">Download PDF</a>
<a href="download.php?file=otherfile.pdf">Download PDF</a>

可能更好的方法是在 Web 服务器级别(这可以在 .htaccess 中)这将强制所有 PDF 被视为二进制文件(强制浏览器下载它们)在您的目录中和下面把这个放进去。

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

【讨论】:

【参考方案2】:

用标题和读取文件创建一个新页面,然后使下载链接指向该页面,这将返回 PDF 文件。

例如:

<a href="download.php?file=file.pdf">Download Me</a>

下载.php的来源:

$filename = $_REQUEST['file'];
header("Content-type:application/pdf");
// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='$filename'");

// The PDF source is in file.pdf
readfile($filename);

【讨论】:

【参考方案3】:

或者您可以在 html 的锚标记中使用新的 HTML5 属性 download

代码看起来像

<a download href="path/to/the/download/file"> Clicking on this link will force download the file</a>

【讨论】:

以上是关于如何在不离开 php 页面的情况下强制保存另存为对话框?的主要内容,如果未能解决你的问题,请参考以下文章

vim编辑下几个退出保存的命令

在不保存工作簿的情况下更改 Excel 中的默认另存为位置

如何通过强制另存为选项来保存网页的内容/文本

将表单结果另存为 PDF

如何将 Excel 文件另存为 CSV? [复制]

使用php另存为网页