我正在使用Martin Barker的代码/答案(PHP to protect PDF and DOC)几乎是verbatum,唯一的区别是我保护的文件位于public_html文件夹上方的用户文件夹中
文件夹结构
/users/websupport
/public_html
要下载的文件位于:
/users/websupport/FileToDownload.pdf
download.php文件位于
/public_html/download.php
但Firefox告诉我它找不到Firefox上的文件,无法在download.php找到该文件。
我已通过ftp确认该文件存在。
如果将文件放在webroot之外,我是否需要向网站添加内容.htaccess?只是不确定我在哪里出错。下面是download.php中的代码
//check users is loged in and valid for download if not redirect them out
// YOU NEED TO ADD CODE HERE FOR THAT CHECK
// array of support file types for download script and there mimetype
$mimeTypes = array(
'doc' => 'application/msword',
'pdf' => 'application/pdf',
);
// set the file here (best of using a $_GET[])
$file = "../users/websupport/2011cv.pdf";
// gets the extension of the file to be loaded for searching array above
$ext = explode('.', $file);
$ext = end($ext);
// gets the file name to send to the browser to force download of file
$fileName = explode("/", $file);
$fileName = end($fileName);
// opens the file for reading and sends headers to browser
$fp = fopen($file,"r") ;
header("Content-Type: ".$mimeTypes[$ext]);
header('Content-Disposition: attachment; filename="'.$fileName.'"');
// reads file and send the raw code to browser
while (! feof($fp)) {
$buff = fread($fp,4096);
echo $buff;
}
// closes file after whe have finished reading it
fclose($fp);
答案 0 :(得分:0)
确保您的php脚本运行的用户具有对该目录的读访问权。
在大多数debian衍生品的apache中嵌入的php中,用户将是'www-data'。
答案 1 :(得分:0)
我最近遇到了同样的问题,其中readfile()和fpassthru()在我的服务器上无效。
我最终做的是根据需要为文件创建符号链接并将其传递给用户。您可以了解如何创建符号链接here。
我用过
exec("ln -s source_file_full_path full_path_to_fake_file");
如果您希望您的用户拥有类似“http://somesite.com/folder/fake_file.pdf”的链接,那么完整路径就是服务器上“文件夹”的位置,您可以在假文件路径中包含“fake_file.pdf”。
然后过期链接我再次调用以查找创建日期早于x分钟的所有符号链接。您可以在this answer中查看如何执行此操作。 (这可能是确保他们按时到期的一项重要工作。)