如何在不离开 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 页面的情况下强制保存另存为对话框?的主要内容,如果未能解决你的问题,请参考以下文章