3

我正在尝试制作一个简单的脚本来做两件事:

  1. 提供一个文件并隐藏它的目的地
  2. 有下载计数器

现在,我在 wordpress 环境中执行此操作,但这个问题并不完全与 wordpress 相关,所以我想我会在这里问。

基本上,我目前设置它的方式是我有一个链接,当您单击它时会设置一个链接,$_['GET']然后检查它是否已设置。如果设置,则提供下载文件。

链接:<a href="http://localhost:8888/fresh/?dl_id=01">Click here!</a>'

$_['GET']代码: http : //pastebin.com/93nD43gA

代码中有一些 wordpress 行话,但基本上它是检查下载计数 user_meta,如果它 > 0,serveFile()则调用它。

我在这里遇到的主要问题是,如果我单击链接,readfile()会将实际文件内容加载到窗口中(乱码文本)。如果我添加一个target=_blank<a>它会打开一个新的浏览器窗口并将内容加载到窗口中。

当我将它作为独立的 php 文件执行时,这种方法似乎工作得很好。我的主要问题是我需要保留 wordpress 空间,以便我可以调用与之关联的函数等。

我尝试$_['GET']在 self 页面、带有自定义模板的另一个页面(上面的 pastebin 中的代码)以及独立的 php 文件中使用 。前两个选项都将文件加载到窗口中。第三个不保留 wordpress 功能,即使我包含blog-header.php.

谁能指出我如何让​​文件强制下载而不加载到窗口的正确方向?

4

2 回答 2

3

无论文件类型是什么,您都需要设置适当的标题。例如,如果readfile始终提供 PDF,则应该这样做:

// disable browser caching -- the server may be doing this on its own
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header('Content-Type: application/pdf');
//forces a download
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename=filename.pdf');
readfile($file);

请记住,header仅当您根本没有在请求中发送任何数据(包括空格)时才有效。

于 2012-09-27T20:31:25.387 回答
-2

“乱码”文本是您想要的,但除此之外您还必须设置一个 mime。这可以通过简单地设置一个标题来完成,例如header("Content-Type: image/png");

如果文件 mimes 会有所不同(例如 pdf、doc、png 等),您应该查看 finfo 扩展名。有了它,您可以获得文件的完整和正确的 mime

<?php
$finfo = new \finfo(FILEINFO_MIME);
$mime = $finfo->file('path/to/file', FILEINFO_MIME_TYPE);
header("Content-Type: $mime");

如前所述 - 只有在没有写入输出的情况下才能设置标头(没有回显、打印等。输出缓冲可以在这里为您提供帮助)。

于 2012-09-27T20:34:59.190 回答