复制并下载htaccess保护文件夹中的文件


Copy and download file in htaccess protected folder

我有一个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(Acrobat6)不起作用,但AcrobatX文件起作用。docx文件的计数相同。有些有效,有些无效。非常奇怪,因为我可以直接在我的电脑上打开所有文件。我认为这与application/pdf行(或application/vnd.openxmlformats officedocument.wordprocessingml.dococument'for docx)有关。所有其他的,像图像一样,都起作用。

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

但最重要的是,htaccess和htpasswd会过度运行您的脚本,即使是在同一台主机上,因为它们缺乏更好的描述服务器级别,甚至在php开始页面加载过程之前就已经运行了。