dirname (__ FILE__)에서 한 수준 위로 이동하는 방법


80

다음과 같은 폴더 구조가 있습니다.

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

폴더 B의 이미지를 가리키는 '../Folder-B/image1.jpg'라는 데이터베이스의 문자열이 있습니다.

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

이것은 페이스 북 공유 버튼 용이며 올바른 이미지를 가져 오지 못합니다. 누구든지 경로를 올바르게 얻는 방법을 알고 있습니까?

편집 : URL을 얻고 싶습니다 >>> mydomain.com % 2FFolder-B % 2Fimage1.jpg


Petah의이 대답은 실제로 받아 들여진 대답보다 질문에 더 잘 대답합니다. (실제로 레벨을 올리는 방법뿐만 아니라이를 피하는 방법 만 알려줍니다.)
Byson

답변:


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

1
@Petah-나는 이것에 몇 시간을 보냈고 realpath()당신의 게시물에서 발견 했습니다. 출력으로 마지막 문제를 완벽하게 해결했습니다. 감사합니다!
제임스

1
이 답변은 실제로 질문에 대한 답변입니다. 받아 들여진 대답은 문제를 피하기위한 해결 방법을 제공 할 뿐이지 만 실제로 "dirname ( FILE ) 에서 한 수준 위로 이동하는 방법"을 알려주지는 않습니다 . 잘 했어.
Byson

1
다른 방법 :dirname(__DIR__)
Nefelim

@Nefelim 예, 다른 답변에서 언급되었습니다.
Petah


17

이 시도

dirname(dirname( __ FILE__))

편집 : 올바른 구문이 아니기 때문에 "./"를 제거했습니다. 그것 없이는 완벽하게 작동합니다.


6

PHP의 dirname 함수를 사용할 수 있습니다. <?php echo dirname(__DIR__); ?>. 그러면 __DIR__현재 디렉토리를 저장하는 의 상위 디렉토리 이름이 제공됩니다 .


나는 그것을 시도했고 URL을 얻을 수 있습니다. 문제는 데이터베이스에 저장된 대상 파일 이름에 ../가 있다는 것입니다. 최종 URL에서 제거해야합니다.
aVC

다음과 같은 줄을 따라있는 정규 표현식 일 수 있습니다. /[^\/\]+\.\.\/?\/ 경로에서 부모 /../를 제거하는 데 사용합니다. '해야'작동하지만 테스트하지 않았습니다.
Shane

죄송합니다. 위의 정규식에서 약간의 오류가 발생했습니다.? \ / 실제로는? /이어야합니다.
Shane

문제 없습니다. 오타라고 생각했습니다. 나는 몇 가지 추가 읽기로 문제를 파악했습니다. 귀하의 의견 : 감사합니다
AVC

최고의 솔루션 이럴
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__)));

창에 또한 교체 \/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 );다음을 사용하는 것이 가능합니다.

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.