php cách lên một cấp trên dirname (__ FILE__)


80

Tôi có cấu trúc thư mục như sau:

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

Tôi có một chuỗi từ Cơ sở dữ liệu là '../Folder-B/image1.jpg', trỏ đến một hình ảnh trong Thư mục-B.

Bên trong một tập lệnh trong Thư mục-A, tôi đang sử dụng dirname ( FILE ) để tìm nạp tên tệp và tôi nhận được mydomain.com/Folder-A. Bên trong tập lệnh này, tôi cần lấy một chuỗi có nội dung 'mydomain.com/Folder-B/image1.jpg. Tôi đã thử

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

Điều này hiển thị là mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

Đây là cho một nút chia sẻ facebook và nó không thể tìm nạp hình ảnh chính xác. Bất cứ ai biết làm thế nào để có được đường dẫn một cách chính xác?

Chỉnh sửa: Tôi hy vọng nhận được một url >>> mydomain.com% 2FFolder-B% 2Fimage1.jpg


Câu trả lời này của Petah thực sự trả lời câu hỏi tốt hơn câu trả lời được chấp nhận. (Nó thực sự cho bạn biết làm thế nào để di chuyển lên một cấp độ, không chỉ là làm thế nào để tránh phải.)
Byson

Câu trả lời:


206

Đối với PHP <5.3 sử dụng:

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

Trong PHP 5.3 đến 5.6 sử dụng:

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

Trong PHP> = 7.0 sử dụng:

$upOne = dirname(__DIR__, 1);

Vấn đề là, tệp mục tiêu của tôi được lưu dưới dạng ../Folder-B/image1.jpg trong cơ sở dữ liệu. Vì vậy, với cách tiếp cận của bạn cũng như của tôi, tôi nhận được mydomain.com/Folder-A/../Folder-B/image1.jpg. Nút chia sẻ không nhận ra nó, mặc dù vậy Nếu tôi sao chép nó vào trình duyệt, nó dường như tìm nạp đúng hình ảnh.
aVC

1
@Petah - Tôi đã dành hàng giờ cho việc này, sau đó khám phá ra realpath()từ bài đăng của bạn. Giải quyết khúc mắc cuối cùng của tôi với đầu ra một cách hoàn hảo, cảm ơn bạn!
James

1
Câu trả lời này thực sự trả lời câu hỏi. Câu trả lời được chấp nhận chỉ cung cấp một giải pháp để tránh sự cố, nhưng không thực sự cho chúng ta biết "cách tăng một cấp trên dirname ( FILE )". Làm tốt.
Byson

1
Cách khác:dirname(__DIR__)
Nefelim

@Nefelim yea, điều đó được đề cập trong các câu trả lời khác.
Petah


17

Thử cái này

dirname(dirname( __ FILE__))

Chỉnh sửa: đã xóa "./" vì nó không đúng cú pháp. Không có nó, nó hoạt động hoàn hảo.


6

Bạn có thể sử dụng hàm dirname của PHP. <?php echo dirname(__DIR__); ?>. Điều đó sẽ cung cấp cho bạn tên của thư mục mẹ __DIR__, nơi lưu trữ thư mục hiện tại.


Tôi đã thử điều đó và tôi có thể lấy được url. vấn đề là, tôi có ../ trong tên tệp đích của tôi được lưu trong cơ sở dữ liệu. Tôi cần loại bỏ điều đó trong url cuối cùng.
aVC

Có thể là một biểu thức chính quy, một cái gì đó dọc theo các dòng: /[^\/\]+\.\.\/?\/ Sử dụng biểu thức đó để xóa /../ gốc khỏi đường dẫn. 'nên' hoạt động, tuy nhiên chưa thử nghiệm.
Shane

Xin lỗi, tôi thực hiện một lỗi nhỏ ở trên biểu thức chính quy, \ / thực sự cần được /?
Shane

Không sao, tôi nghĩ đó là lỗi đánh máy. Tôi đã tìm ra vấn đề với một số bài đọc bổ sung. Cảm ơn những ý kiến ​​đóng góp của bạn :)
aVC

Giải pháp tốt nhất IMHO
Nefelim

1

Bạn có thể sử dụng realpathđể loại bỏ phần không cần thiết:

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

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

Trên windows cũng thay thế \bằng /nếu cần trong URL.


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

cấp độ là bao nhiêu lần bạn sẽ quay lại thư mục


0

Một cấp độ lên, tôi đã sử dụng:

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

hoặc đối với php <5.3:

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

0

Đối với Whom, bỏ qua môi trường lưu trữ chia sẻ và vẫn có cơ hội có PHP hiện tại nhỏ hơn 7.0 Ai không có dirname( __FILE__, 2 );nó có thể sử dụng sau.

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

Tôi sử dụng điều này, nếu có một đường dẫn tuyệt đối (đây là một ví dụ):

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

nếu có một hình ảnh để hiển thị, điều này là đủ:

echo("<img src='/Folder-B/image1.jpg'>");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.