好的,首先道歉,因为我意识到这是一个之前已经被多次讨论过的话题 - 相信我,我知道,我已经阅读了所有以前的问题和答案,但仍然无法使其发挥作用。< / 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
限制问题 - 我很确定不是。
我确信我有一些非常简单的东西 - 我哪里出错了?
作为额外的额外内容,我还没有编写用于上传文件的脚本 - 在进行此操作之前,有什么我应该提前知道的吗?
谢谢!
答案 0 :(得分:0)
我曾经遇到过这个问题。它不是一个真正的解决方案,而是一种解决方法。我所做的是将我的文件下载到webroot内的tmp文件夹中。然后,每小时或每天,在服务器上运行一个cron作业(Plesk上的计划任务),使用linux copy命令将我的临时文件夹中的每个文件复制到webroot之外的另一个文件夹中。
但是,您可以在这里查看您想要的内容:
希望这可以帮到你。
答案 1 :(得分:0)
经过多次反复试验,我似乎已经解决了这个问题。
问题在于使用jQuery / Ajax。
当我更改了downloadscript.php
文件从页面上的链接访问直接$_GET
请求的方式时,它就是一种享受。
无论如何,感谢大家的帮助!
克里斯