尽管路径似乎正确,但文件不存在

Posted

技术标签:

【中文标题】尽管路径似乎正确,但文件不存在【英文标题】:File does not exist though the path seems right 【发布时间】:2015-07-27 05:35:53 【问题描述】:

我不明白为什么 file_exists() 找不到我的文件,尽管路径似乎正确。

这是我的脚本:

if($_POST['delete-avatar'] == 'on') 
  $q = execute_query("SELECT avatar FROM gj_customers WHERE id_customer = '$_GET[id]'");
  $customer = $q->fetch_assoc();
  $img_path = $_SERVER['DOCUMENT_ROOT'] . WEBSITE_ROOT . $customer['avatar'];
  var_dump($img_path);

  if(!empty($customer['avatar'])  && file_exists($img_path))
    unlink($img_path);
  

我在 MAMP 上,我的网站在 htdocs/gamejutsu/www/ 中,WEBSITE_ROOT 包含 '/gamejutsu/www/' 并且头像在 img/avatars/ 中。

$img_path 上的 var_dump 返回我:/Applications/MAMP/htdocs/gamejutsu/www/img/avatars/Sonik_avatar.jpg。

如果我在 localhost:8888/gamejutsu/www/img/avatars/Sonik_avatar.jpg 上显示图像。

我从不进入 if 块。如果我删除 file_exists 测试我有一个警告: unlink(/Applications/MAMP/htdocs/gamejutsu/www/img/avatars/Sonik_avatar.jpg): No such file or directory in /Applications/MAMP/htdocs/gamejutsu/www/第 67 行的 admin/members.php

我很确定我错过了一些东西,但对我来说一切似乎都很好,我在我网站的其他地方使用相同的方法没有任何问题。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

在没有访问权限的情况下调试您的应用程序很复杂,但您可以尝试返回 realpath();

var_dump(realpath($img_path))

如果返回空文件不存在或您的应用程序没有访问它。

尝试打开你的控制台和这个命令:

cd /Applications/MAMP/htdocs/gamejutsu/www/img/avatars/

如果您有错误路径,则必须手动检查它(最简单的是通过控制台),如果您可以在此目录中 cd。请在此处添加此目录的 ls 以检查权限:

ls -la /Applications/MAMP/htdocs/gamejutsu/www/img/avatars/

如果一切看起来不错,请尝试将您的控制台用户更改为网络服务器用户(通常是 www-data)并尝试访问文件

sudo su
su www-data
cat /Applications/MAMP/htdocs/gamejutsu/www/img/avatars/Sonik_avatar.jpg

如果您可以访问此文件(它将是二进制数据)权限就可以了,否则请检查您是否有正确的文件权限以及您是否良好的所有者和文件组。

【讨论】:

感谢您的意见。 var_dump(realpath($img_path)) 返回错误。 cd /Applications/MAMP/htdocs/gamejutsu/www/img/avatars/ 有效,所以路径很好。但是所有文件的权限并不相同(尽管它们以相同的方式上传)。有些有 -rw-r--r-- 有些有 -rwxrwxrwx 如果您手动将权限更改为 (777) 是否有效?这很奇怪,因为如果您具有读取权限,则可以通过 realpath 和 file_exists 访问文件。您是否尝试使用来自 var_dump($img_path) 的路径的 cd 命令?另外我更新了我的答案 我尝试上传一个新头像,它有 -rw-r--r-- 。对于这个文件,我可以拥有 real_path,所以我似乎是对的。我认为更改应用程序文件夹时权限已更改。但是,我不知道如何更改权限(我正在寻找它)。 权限可以通过“chmod 777 /path/to/file”改变【参考方案2】:

尝试只使用网站根目录,不要使用 $_SERVER['DOCUMENT_ROOT']。

【讨论】:

它没有解决问题:警告:取消链接(/gamejutsu/www/img/avatars/Billy_avatar.jpg):/Applications/MAMP/htdocs/gamejutsu/www/ 中没有这样的文件或目录admin/members.php 第 67 行 OP为什么要“试试这个”?【参考方案3】:

另一种方法是识别路径。

if($_POST['delete-avatar'] == 'on') 
    $q = execute_query("SELECT avatar FROM gj_customers WHERE id_customer = '$_GET[id]'");
    $customer = $q->fetch_assoc(); 
    $img_path =' filename' . WEBSITE_ROOT . $customer['avatar']; 
    var_dump($img_path);

    if(!empty($customer['avatar']) && file_exists($img_path))        
        unlink($img_path);
    


【讨论】:

以上是关于尽管路径似乎正确,但文件不存在的主要内容,如果未能解决你的问题,请参考以下文章

尽管表上存在行,但休眠查询不返回任何内容

PIG ERROR 2118:输入路径不存在

Java 在给定路径上创建文件,所在文件夹不存在时,如何正确创建。

FileNotFoundException,但文件存在于正确的路径。

尽管文档说了啥,但复合 Android 传感器不存在

PostgreSQL - 尽管运行 CREATE LANGUAGE,但语言 pgplsql 不存在