【问题标题】:php how to go one level up on dirname(__FILE__)php 如何在 dirname(__FILE__) 上上一级
【发布时间】:2012-06-21 03:02:45
【问题描述】:

我的文件夹结构如下:

mydomain.com
  ->Folder-A
  ->Folder-B

我有一个来自数据库的字符串'../Folder-B/image1.jpg',它指向Folder-B 中的一个图像。

在文件夹-A 的脚本中,我使用 dirname(FILE) 来获取文件名,我得到了 mydomain.com/Folder-A。在这个脚本中,我需要得到一个字符串,上面写着'mydomain.com/Folder-B/image1.jpg。我试过了

$path=dirname(__FILE__).'/'.'../Folder-B/image1.jpg';

这显示为mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

这是一个 facebook 分享按钮,它无法获取正确的图像。有人知道如何正确获取路径吗?

编辑:我希望得到一个网址>>>mydomain.com%2FFolder-B%2Fimage1.jpg

【问题讨论】:

  • This answer by Petah 实际上比接受的答案更好地回答了这个问题。 (它实际上告诉你如何提升一个级别,而不仅仅是如何避免不得不这样做。)

标签: php dirname


【解决方案1】:

对于 PHP

$upOne = realpath(dirname(__FILE__) . '/..');

在 PHP 5.3 到 5.6 中使用:

$upOne = realpath(__DIR__ . '/..');

在 PHP >= 7.0 中使用:

$upOne = dirname(__DIR__, 1);

【讨论】:

  • 问题是,我的目标文件在数据库中保存为../Folder-B/image1.jpg。因此,通过您和我的方法,我得到了 mydomain.com/Folder-A/../Folder-B/image1.jpg。共享按钮无法识别它,但如果我将其复制到浏览器,它似乎会获取正确的图像。
  • @Petah - 我在这上面花了几个小时,然后从你的帖子中发现了realpath()。完美解决了我最后的输出问题,谢谢!
  • 这个答案实际上回答了这个问题。接受的答案只是提供了一种解决方法来避免这个问题,但实际上并没有告诉我们“如何在 dirname(FILE) 上上一层楼”。干得好。
  • 替代方式:dirname(__DIR__)
  • @Nefelim 是的,这是在其他答案中提到的。
【解决方案2】:

您可以使用 PHP 的 dirname 函数。 <?php echo dirname(__DIR__); ?>。 这将为您提供 __DIR__ 的父目录的名称,该目录存储当前目录。

【讨论】:

  • 我试过了,我可以得到网址。问题是,我的目标文件名中有一个 ../ 保存在数据库中。我需要在最终网址中删除它。
  • 可能是一个正则表达式,类似于: /[^\/\]+\.\.\/?\/ 使用它从路径中删除父级/../。 “应该”工作,但尚未测试。
  • 对不起,我在上面的正则表达式中犯了一个小错误,?\/实际上应该是?/
  • 没问题,我认为这是一个错字。我确实通过一些额外的阅读找出了问题所在。感谢您的 cmets :)
  • 最佳解决方案恕我直言
【解决方案3】:

试试这个

dirname(dirname( __ FILE__))

编辑:删除“./”,因为它的语法不正确。没有它,它也能完美运行。

【讨论】:

    【解决方案4】:

    我用这个,如果有绝对路径(这是一个例子):

    $img = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']."/Folder-B/image1.jpg");
    

    如果有图片可以展示,这就够了:

    echo("<img src='/Folder-B/image1.jpg'>");
    

    【讨论】:

      【解决方案5】:

      您可以使用realpath 删除不需要的部分:

      // One level up
      echo str_replace(realpath(dirname(__FILE__) . '/..'), '', realpath(dirname(__FILE__)));
      
      // Two levels etc.
      echo str_replace(realpath(dirname(__FILE__) . '/../..'), '', realpath(dirname(__FILE__)));
      

      在 Windows 上,如果 URL 中需要,也将 \ 替换为 /

      【讨论】:

        【解决方案6】:

        上一级,我用过:

        str_replace(basename(__DIR__) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';
        

        或者对于 php

        str_replace(basename(dirname(__FILE__)) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';
        

        【讨论】:

          【解决方案7】:

          如果你碰巧有 php 7.0+,你可以使用关卡。

          dirname( __FILE__, 2 ) 使用第二个参数可以定义要返回的关卡数量。

          http://php.net/manual/en/function.dirname.php

          【讨论】:

            【解决方案8】:

            To Whom,处理共享托管环境,仍然有机会让当前 PHP 低于 7.0 没有dirname( __FILE__, 2 );的可以关注。

            function dirname_safe($path, $level = 0){
                $dir = explode(DIRECTORY_SEPARATOR, $path);
                $level = $level * -1;
                if($level == 0) $level = count($dir);
                array_splice($dir, $level);
                return implode($dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
            }
            
            print_r(dirname_safe(__DIR__, 2));
            

            【讨论】:

              【解决方案9】:
              dirname(__DIR__,level);
              dirname(__DIR__,1);
              

              level 是您将返回文件夹的次数

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-02-26
                • 2011-09-24
                • 2012-10-23
                • 1970-01-01
                • 1970-01-01
                • 2011-02-14
                • 2014-02-04
                • 1970-01-01
                相关资源
                最近更新 更多