php dirname(__ FILE__)を1つ上げる方法


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


ペタによるこの答えは、実際には、受け入れられた答えよりもよく質問に答えます。(実際には、レベルを上げる方法だけでなく、レベルを上げる方法も説明しています。)
Byson 2014

回答:


206

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)で1レベル上に移動する方法」を教えてくれません。よくやった。
バイソン2014

1
別の方法:dirname(__DIR__)
Nefelim 2018年

@Nefelim yea、それは他の回答で言及されています。
ペタ


17

これを試して

dirname(dirname( __ FILE__))

編集:構文が正しくないため、「。/」を削除しました。それがなければ、それは完全に機能します。


6

PHPのdirname関数を使用できます。 <?php echo dirname(__DIR__); ?>。これにより__DIR__、現在のディレクトリを格納するの親ディレクトリの名前がわかります。


私はそれを試しました、そして私はURLを得ることができます。問題は、データベースに保存されているターゲットファイルの名前に../が含まれていることです。最終的なURLでそれを取り除く必要があります。
aVC 2012年

/ [^ \ / \] + \。\。\ /?\ /の行に沿った正規表現かもしれません。これを使用して、パスから親/../を削除します。「動作するはず」ですが、テストは行っていません。
シェーン2012年

申し訳ありませんが、上記の正規表現にわずかな誤りがありました。?\ /は実際には?/
Shane

問題ありません、タイプミスだと思いました。私はいくつかの追加の読書で問題を理解しました。コメントありがとうございます:)
aVC 2012年

ベストソリューションIMHO
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

1つ上のレベルで、私は使用しました:

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 );可能性があります。持っていない人は、以下を使用することができます。

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'>");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.