【问题标题】:PHP: file_exists always returns FALSEPHP:file_exists 总是返回 FALSE
【发布时间】:2019-05-06 04:31:40
【问题描述】:

背景:

我正在尝试将 PDF 文件提供给我的用户,但不能提供给其他人。建议似乎是将这些放在站点根目录之上但网络根目录之下。第一步是测试文件是否存在,结果始终为 FALSE。 问题:为什么 file_exists 总是返回 false? 尝试过的事情 1. 在 Web 根目录中创建名为“a”的目录(以避免拼写错误)。 file_exists("/a/") 为假 file_exists("/a/info.pdf") 为假,尽管文件存在 2. clearstatcache();在 file_exists 之前 3. 添加allow_url_fopen = on 到根目录下的php.ini

enter code here

  clearstatcache();  
  $full_path = '/a/info.pdf';  // absolute physical path to file below web root.
  if ( file_exists($full_path) )
     {
     $mimetype = 'application/pdf';

     header('Cache-Control: no-cache');
     header('Cache-Control: no-store');
     header('Pragma: no-cache');
     header('Content-Type: ' . $mimetype);
     header('Content-Length: ' . filesize($full_path));

     $fh = fopen($full_path,"rb");
     while (!feof($fh)) { print(fread($fh, filesize($full_path))); }
     fclose($fh);
     }
   else die("File does not exist on the server - .");

总是跟在 else 后面。 我还能尝试什么?

【问题讨论】:

  • file_exists() 使用文件系统的绝对文件路径而不是 Web 根目录。

标签: php file exists


【解决方案1】:

首先你必须阅读file_exists()的文件

如果没有发现错误,请检查文件夹文件scandir()

例如:

print_r(scandir('/a/'));

然后您可以看到您的文件不存在。

您的问题可能是其中之一:

  1. 路径问题
  2. 文件名有问题

【讨论】:

  • scandir() 也看不到该目录。目录和文件的模式都是 755。
  • @lain 所以你的问题出在你的路径路径上,用DIR获取你的直接文件路径
  • 所提供的代码删除了大部分变量并简化了文件名。我正在寻找打开路径从根目录开始的文件 /a/info.pdf 。 FileZilla 看到文件(它成功了!)但 file_exists 没有。
  • @Iain ftp 路径与您的 php 路径代码不同,例如您的 ftp 主路径可能是 /Iain/public_html/ 所以您的文件地址是 /Iain/public_html/a/info.pdf跨度>
  • 我很惊讶像 file_exists() 这样的主流函数给出了错误的结果,原因是即使经过数小时的研究也无法解释。我放弃将文件放在根目录之上,而是将它们全部(包括 PDF)放入数据库以实现安全性。
【解决方案2】:

当您像 /a/file.pdf 一样使用完整路径时,实际上您是在尝试从整个服务器的根文件夹中获取文件,而不是您在服务器中的帐户的 DOCUMENT_ROOT。

例如:

你有账号,公共文件夹是:

/home/{ACCOUNT_NAME}/public_html/index.php

所以当您尝试“/a/file.pdf”时,您不会得到:

/home/{ACCOUNT_NAME}/a/file.pdf

您只需要在您的帐户中定义和检查绝对路径,

例如,正如我所写,使用您帐户的完整路径:

/home/{ACCOUNT_NAME}/a/file.pdf

如果您尝试使用 index.php 文件,甚至可以使用相对路径:

../a/file.pdf

如果您不知道帐户的完整路径,

看看你有什么:$_SERVER['DOCUMENT_ROOT'] 变量

【讨论】:

  • 谢谢shushu304。这完全解决了问题。 FileZilla 将文档根目录显示为 / 并且我从那里做出了错误的假设。
【解决方案3】:

如果您将查询字符串添加到文件名的末尾,file_exists 也会返回 false。

人们经常在图像文件名的末尾附加一个随机生成的值,以确保浏览器不会从缓存中获取图像(以防刚刚上传了同名的新图像)。

例如,如果您的文件名为“images/staff/staff1.jpg

file_exists("images/staff/staff1.jpg") // Returns true
file_exists("images/staff/staff1.jpg?21545884")  // Returns false

img 标签可以接受任一字符串为有效,但 file_exists 更挑剔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2017-04-29
    • 2013-04-30
    • 2015-01-20
    • 2011-09-30
    相关资源
    最近更新 更多