如何在不离开页面的情况下强制执行“另存为”对话框?

时间:2010-07-09 11:09:28

标签: php jquery header anchor savefiledialog

我有一个锚标记:

<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(更简单的方法)显示“另存为”对话框?

3 个答案:

答案 0 :(得分:4)

使用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>

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

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

答案 1 :(得分:0)

使用标题和readfile创建一个新页面,然后使下载链接参考页面,该页面将返回PDF文件。

例如:

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

download.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);

答案 2 :(得分:0)

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

代码看起来像

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