2012-01-31 79 views
1

我有一个htaccess密码保护文件夹中有几个文件。用户不允许访问所有文件,但可以自行下载。复制并下载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语句?

如果还有另一种更好的方法,我乐于接受。

UPDATE

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

+0

我复制了你的代码,它对我很好。尝试在'file_get_contents'后添加'die()' – Narek 2012-01-31 09:02:17

+0

谢谢Narek。我尝试死(),但没有奏效。我只是用一个较旧的PDF测试它,并且工作。这可能是文件头部有问题吗?是否有可能用于不同PDF,DocX,Tiffs等的某种“通用”标题?我的意思是在这行标题('Content-type:application/pdf'); – mat 2012-01-31 09:10:51

+0

@mat,我明白了你的观点,我会删除以前的评论,因为它们似乎不合适。 – Jacco 2012-01-31 09:50:57

回答

0

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

,但底线是htaccess以及htpasswd的在运行脚本,即使在同一台主机上,因为他们是在一个缺乏更好的描述服务器级别的运行,即使php在页面加载时启动其进程。

+0

因为我可以下载文件,所以不完全。即使是正确的文件有时,但较旧的PDF似乎会导致问题。旧版doc文件的计数相同。 – mat 2012-01-31 13:00:22

相关问题