0

我几乎逐字逐句地使用 Martin Barker 的代码/答案(PHP 来保护 PDF 和 DOC),唯一的区别是我要保护的文件位于 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);
4

2 回答 2

0

确保您的 php 脚本运行的用户具有对该目录的读取权限。

在大多数 debian 衍生产品中嵌入 apache 的 php 上,用户将是“www-data”。

于 2012-06-25T15:52:04.770 回答
0

我最近遇到了同样的问题,readfile() 和 fpassthru() 在我的服务器上不起作用。

我最终做的是根据需要为文件创建符号链接并将它们传递给用户。您可以在此处了解如何创建符号链接。

我用了

exec("ln -s source_file_full_path full_path_to_fake_file");

如果您希望您的用户拥有像“ http://somesite.com/folder/fake_file.pdf ”这样的链接,那么完整路径将是“文件夹”在您的服务器上的位置,并且您将在其中包含“fake_file.pdf”你的假文件路径。

然后为了使链接失效,我再次调用以查找创建日期早于 x 分钟的所有符号链接。您可以在这个答案中看到如何做到这一点。(这可能是一项 cron 作业,以确保它们按时到期。)

于 2017-07-05T15:49:01.487 回答