file download permission denied to read the file
我正在使用php readfile函数忽略提供服务器上文件的完整直接url。但是,它仅显示错误而不是下载文件,并显示failed to open stream: No such file or directory in。但是,该文件位于指定的目录中。
我尝试下载的文件是由用户上传的(即我认为是httpd进程,它将是所有者)。但是以下代码显示无法打开文件-
1 2 3 4 5 6 7 8 9 10
| $full_path = $row['full_path'];
$file_name = $row['file_path'];
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Type: application/pdf');
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename="".$file_name.""");
readfile($full_path); |
该目录的默认权限设置为755,我正在下载的文件也将权限显示为755。我无法理解这里的问题。
编辑:服务器是hostgator。
编辑:header(" Location:$ full_path")工作正常,所以我认为它与路径无关。
编辑:$full_path看起来像-uploads/abc.pdf,而$file_path看起来像abc.pdf
文件结构:
1 2 3 4
| --root
downloader.php
---uploads
abc.pdf |
- 好吧,这并不是说它找不到有趣的文件。所使用的路径可能有问题。请告诉我们$row['full_path'];,$row['file_path']等中的内容。
-
文件上的755使其成为可执行文件。尝试将其更改为644。
-
@Oldskool我已经编辑了问题,以包括您询问的详细信息。你能再看看...谢谢
-
@ Fred-ii-是的,我只是暂时让他们
-
@codeomnitrix Uhm,如果它在标头中工作,则表示它是URL,而不是路径。仅当在php.ini中启用allow_url_fopen时,此方法才有效。并且仅当它是包含http://www.domain.com/的完整URL时。
-
请发布$full_path和您的文件系统布局的示例。
-
@arkascha更新了变量的详细信息
-
那么,如果/uploads/abc.pdf回到根,会发生什么?
-
"文件系统布局"是指文件在本地文件系统中的位置,执行的脚本的位置以及它们之间的相互关系。我怀疑您的脚本访问文件所需的路径与您期望的路径不同。
-
@arkascha脚本位于根文件夹中,而abc.pdf位于子文件夹中。我怀疑我是否能完全接受您的评论
-
那时您当前的工作目录是什么?也许您的脚本的某些部分将其更改为进行某些转换或类似操作?
-
还有一个一般性说明:您应该将uploads文件夹移动到不在通过http服务器发布的文件树中。一个安全性问题,因此您可以确定没有人可以绕过您的download.php脚本。这样做时,您可能还希望将"完整路径"的uploads/部分更改为存储在配置文件中某个位置的绝对路径,以使您的代码可移植到不同的系统中。
-
var_dump();揭示了什么?确保也没有在任何地方引入空白。在这一点上,我有点困惑。也许错误报告也php.net/manual/en/function.error-reporting.php和/或可能与数据库代码有关。
-
WTF,字符串的末尾有一个空格。我为此感到非常抱歉,我从未对此进行检查。多亏你们大家,我将结束这个问题
-
有一些不清楚的地方,您可能在问题中打了错字。您说:" $ full_path看起来像-uploads / abc.pdf,而$ file_path看起来像abc.pdf"-但是我在这里看不到$file_path定义,但是看到的是$file_name。另外,您确定您不在这里的$row循环之外吗?就像我说的,看看var_dump()揭示了什么,错误报告说了什么
-
@codeomnitrix啊,那我对检查空白的评论就很有帮助了。使用trim()可以解决这个问题。对我而言,值得回答,是/否? ;-)不用客气。
看到我对OP的评论确实解决了这一问题...
我:
"what does var_dump(); reveal? make sure there's no whitespace introduced anywhere also. I'm kind of baffled at this point. Fred -ii-"
OP:
"WTF, there was a whitespace at the end in the string. I am really sorry for this, I never checked for that. Thanks to all of you guys... a€" codeomnitrix"
我:
trim() would have fixed that in a jiffy
咨询:http://php.net/manual/en/function.trim.php
- 谢谢,如果您不指出,我不会看空白的。非常感谢
-
@codeomnitrix不客气。看到您的代码已签出,那是我认为会导致所有这一切的唯一原因。很高兴知道这一解决方法,欢呼起来。