下载webroot外部的文件

时间:2014-12-11 13:26:14

标签: php apache plesk

好的,首先道歉,因为我意识到这是一个之前已经被多次讨论过的话题 - 相信我,我知道,我已经阅读了所有以前的问题和答案,但仍然无法使其发挥作用。< / p>

我有一个包含可下载文件的文件夹。出于安全考虑,我将此文件放在webroot之外。然而,尽管我付出了最大的努力,但我无法通过我的php脚本来下载该文件。

我正在使用Plesk 11的Linux VPS Apache服务器。

(简化)文件结构如下。 httpdocs文件夹是webroot。 private/uploadedfiles文件夹是我要下载的位置。

-var
 - www
  - vhosts
   - mydomain.org.uk
    - httpdocs (webroot)
    - private
     - uploadedfiles

我正在使用jQuery ajax调用将文件名传递给名为downloadscript.php的PHP脚本。此脚本位于httpdocs webroot中。脚本如下:

<?php

$filename = $_POST['fbpath'];
$path = '/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/' . $filename;

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($path));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
ob_clean();
flush();
readfile($path);
exit;

?>

ajax调用没有问题,但我在PHP日志中收到以下错误消息:

 PHP Warning: readfile(/var/www/vhosts/mydomain.org.uk/private/uploadedfiles/filename.docx): failed to open stream: No such file or directory

我已经检查,双重检查和三重检查,文件肯定存在于uploadedfiles文件夹内。

我还检查过它不是open_basedir限制问题 - 我很确定不是。

我确信我有一些非常简单的东西 - 我哪里出错了?

作为额外的额外内容,我还没有编写用于上传文件的脚本 - 在进行此操作之前,有什么我应该提前知道的吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我曾经遇到过这个问题。它不是一个真正的解决方案,而是一种解决方法。我所做的是将我的文件下载到webroot内的tmp文件夹中。然后,每小时或每天,在服务器上运行一个cron作业(Plesk上的计划任务),使用linux copy命令将我的临时文件夹中的每个文件复制到webroot之外的另一个文件夹中。

但是,您可以在这里查看您想要的内容:

希望这可以帮到你。

答案 1 :(得分:0)

经过多次反复试验,我似乎已经解决了这个问题。

问题在于使用jQuery / Ajax。

当我更改了downloadscript.php文件从页面上的链接访问直接$_GET请求的方式时,它就是一种享受。

无论如何,感谢大家的帮助!

克里斯