【问题标题】:PHP file_exists() says existing file does not existPHP file_exists() 表示现有文件不存在
【发布时间】:2013-09-06 16:41:34
【问题描述】:

我正在尝试根据用户名参数检查 XML 文件是否存在

<?php
$username = $_GET["username"];
$filename = "/documents/$username/data.xml";

if (file_exists($filename)) {
   // output documents
} else {
   echo "No documents exist in your account.";
}
?>

它继续返回文件不存在。

完整路径: http://example.com/documents/{username}/data.xml

为什么我知道文件存在时它继续返回false?

编辑:我在几年前发表了这篇文章,这绝对不是保存用户数据的最佳方式,但这篇文章的答案可以很好地解释 file_exists()。

【问题讨论】:

  • AFAIK,file_exists 不适用于 URL。您必须将$filename 转换为本地路径。
  • echo $filename; 并且权限可能是一个问题。
  • 不要将相对于网络服务器根目录的文件路径与相对于磁盘根目录的文件系统文件路径混淆
  • @StrubT 你的意思是而不是http://example.com/johndoe1/docs.xml, /johndoe1/docs.xml?
  • @brandonjordan 是的,完全正确。 (正如其他人指出的那样,您可以使用其他功能进行远程检查,但我认为当您在本地拥有文件时,您应该在本地进行测试,因为它更容易并且可能更快。)

标签: php


【解决方案1】:

file_exists() 函数设计用于检查与 PHP 代码位于同一服务器上的 本地 文件。

与其他文件处理功能一样,它也可以读取URL,但是这个功能可以被认为是一个安全风险,并且许多服务器禁用它,并限制你只能从本地服务器读取文件。

您应该检查您的服务器是否允许您这样做。如果没有,您将不得不使用不同的方法来读取远程 URL,例如使用 CURL。

另请参阅comments in the file_exists() manual page;一个条目明确给出了如何读取远程文件的答案。这是手动注释中引用的代码:

$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}

【讨论】:

  • 不会有@吗?在get_headers
  • @brandonjordan - 非常正确,可能不应该在那里。但正如我所说,我只是直接从手册页复制代码。我的意思不是“这里是代码”,而是“看看,答案已经在手册中了”。
【解决方案2】:

file_exists 检查文件是否存在于您的本地或计算机的已安装文件系统中。它无法通过http检查远程文件。

要对此进行测试,您可以尝试获取文件并验证发送的标头:

$file = 'http://www.domain.com/somefile.jpg';
$file_headers = get_headers($file);
$exists = ($file_headers[0] != 'HTTP/1.1 404 Not Found');

$exists 文件存在时为真,文件不存在时为假。

【讨论】:

    【解决方案3】:

    file_exist检查本地文件。如果您想通过 URL 检查文件,请使用

    fopen() - 返回 NULL 表示文件尚未打开

    cURL(访问:How can one check to see if a remote file exists using PHP?

    $ch = curl_init("http://example.com/userdata/johndoe1/docs.xml");
    
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    // $retcode > 400 -> not found, $retcode = 200, found.
    curl_close($ch);
    

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 1970-01-01
      • 2011-01-20
      • 2016-01-13
      • 2013-05-19
      • 2015-02-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多