通过readfile()保护/提供文件,强行下载?

时间:2012-09-27 20:28:24

标签: php wordpress readfile force-download

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

  1. 提供文件并隐藏其目的地
  2. 有下载计数器
  3. 现在,我在wordpress环境中这样做,但这个问题并不完全与wordpress有关,所以我想我会问这里。

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

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

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

    代码中有一些wordpress术语,但基本上它正在检查下载计数user_meta,如果它是&gt; 0,serveFile()被调用。

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

    当我将它作为独立的php文件时,这种方法似乎完全正常。我的主要问题是我需要保留wordpress空间,以便我可以调用与之相关的函数等。

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

    有人能指出我如何让​​文件强制下载并且不加载到窗口的正确方向吗?

2 个答案:

答案 0 :(得分: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仅在您未在请求中发送任何数据(包括空格)时才有效。

答案 1 :(得分:-2)

“乱码”文字是你想要的,但除此之外你必须设置一个哑剧。这可以通过简单地设置标题来实现,例如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");

如上所述 - 只有在没有写入输出的情况下才能设置标题(没有回声,打印等等Output buffering可以帮助你)。

相关问题