我正在尝试制作一个简单的脚本来完成两件事:
现在,我在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
。
有人能指出我如何让文件强制下载并且不加载到窗口的正确方向吗?
答案 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可以帮助你)。