在htaccess protected文件夹中复制并下载文件

时间:2012-01-31 08:14:29

标签: php download file-get-contents

我有一个受htaccess密码保护的文件夹,里面有几个文件。不允许用户访问所有文件,但允许用户下载自己的文件。

由于我无法直接链接文件,因为复制/删除不是真正的解决方案,我想我只是使用file_get_contents打开文件并使用正确的标头将其回送到页面中。但是..我没有让它工作..这是我的代码。我得到的错误是,当打开文件时,我从Acrobat中收到“文件已损坏”错误。

<?php
$file = "cms/docs/5641-1.pdf";
header('Content-Description: File Transfer');
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename='.basename("exoticfilename.pdf"));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
if (file_exists($file))
{ 
    echo file_get_contents($file);
}
?>

此外,在此示例中,我只使用PDF文件,但有几种类型的文件。因此我应该根据文件类型更改标头。是否有解决方案,或者我应该使用非常长的if / else语句?

如果还有另一种更好的方法,那我就是开放的。

更新

以上工作,但不是所有文件。较旧的PDF(Acrobat 6)不起作用,但Acrobat X文件可以。 docx文件的计数相同。有些工作,有些则没有。非常奇怪,因为我可以直接在我的电脑上打开所有内容。我假设它与application / pdf行(或docx的application / vnd.openxmlformats-officedocument.wordprocessingml.document')有关。所有其他人,如图像,都可以工作。

1 个答案:

答案 0 :(得分:0)

由于您使用htaccess / htpasswd来保护目录不受热链接水蛭的影响。您无意中阻止从外部源(如客户端的浏览器)访问文件。由于目录需要身份验证才能访问其中的文件,因此您需要编写脚本。在某种意义上通过脚本进行身份验证。我以前见过它,你可以在这里找到关于这个主题的许多参考文献之一 http://koivi.com/php-http-auth/

但是底线是htaccess和htpasswd,即使在同一台主机上运行你的脚本,因为它们缺乏更好的描述服务器级别,甚至在php启动它的页面加载过程之前运行。