PHP如何在目录名(__FILE__)上向上一级


80

我的文件夹结构如下:

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

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

在Folder-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共享按钮的,无法获取正确的图像。有人知道如何正确获取路径吗?

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


Petah的答案实际上比接受的答案更好。(实际上,它告诉您如何提高水平,而不仅仅是告诉自己如何避免。)
Byson 2014年

Answers:


200

对于PHP <5.3,请使用:

$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。共享按钮无法识别它,但是如果将其复制到浏览器中,似乎可以获取正确的图像。
aVC 2012年

1
@Petah-我已经花了几个小时,然后realpath()从您的帖子中发现了。完美地解决了我最后的烦恼,谢谢!
詹姆斯

1
这个答案实际上回答了问题。可接受的答案只是提供一种避免该问题的解决方法,但实际上并没有告诉我们“如何在dirname(FILE)上升级”。做得好。
Byson 2014年

1
另一种方式:dirname(__DIR__)
Nefelim '18

@Nefelim是的,在其他答案中提到。
Petah


17

试试这个

dirname(dirname( __ FILE__))

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


6

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


我试过了,我可以得到网址。问题是,我的目标文件名中有一个../,它保存在数据库中。我需要在最终网址中删除它。
aVC 2012年

也许是一个正则表达式,类似于以下内容:/[^\/\]+\.\.\/?\/使用该表达式从路径中删除父项/../。“应该”工作,但是尚未测试。
Shane 2012年

抱歉,我在上面的正则表达式中犯了一个小错误,?\ /应该实际上是?/
Shane 2012年

没问题,我认为这是一个错字。我确实做了一些额外的阅读来找出问题所在。感谢您的评论:)
aVC 2012年

最佳解决方案恕我直言
Nefelim

1

您可以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。


1
dirname(__DIR__,level);
dirname(__DIR__,1);

级别是您将返回该文件夹多少次


0

上一层,我用过:

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

或对于php <5.3:

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

0

对于谁,共享托管环境失败,仍然有机会使当前PHP低于7.0,而没有谁dirname( __FILE__, 2 );可以使用following。

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));

-3

如果存在绝对路径,则使用此示例(这是一个示例):

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

如果有要显示的图片,那就足够了:

echo("<img src='/Folder-B/image1.jpg'>");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.