2012-06-19 40 views
40

Tôi có một cấu trúc thư mục như sau:php thế nào để đi một cấp trên dirname (__ FILE__)

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 hình ảnh trong Thư mục-B.

Bên trong một kịch bản trong Folder-A, tôi đang sử dụng dirname (FILE) để lấy tên tập tin và tôi nhận được mydomain.com/Folder-A. Bên trong kịch bản này, tôi cần phải nhận được một chuỗi có nội dung là 'mydomain.com/Folder-B/image1.jpg. Tôi cố gắng

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

này xuất hiện như mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

này là dành cho một nút chia sẻ facebook, và điều này thất bại trong việc lấy hình ảnh chính xác. Bất cứ ai biết làm thế nào để có được con đường chính xác?

Edit: Tôi hy vọng sẽ có được một url >>> mydomain.com% 2FFolder-B% 2Fimage1.jpg

+0

[này câu trả lời bằng Petah] (http://stackoverflow.com/questions/11094776/php-how-to-go-one-level-up-on-dirname-file#answer-11094813) 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àm thế nào để tránh phải.) – Byson

Trả lời

114

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

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

Hoặc trong PHP 5.3+ sử dụng:

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

Vấn đề là, Tập tin 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ù nếu tôi sao chép điều này vào trình duyệt, có vẻ như tìm nạp hình ảnh chính xác. – aVC

+0

@Petah - Tôi đã dành hàng giờ để làm điều này, sau đó phát hiện ra 'realpath()' từ bài đăng của bạn. Giải quyết lần niggle cuối cùng của tôi với đầu ra 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 vấn đề, nhưng không thực sự cho chúng ta biết "làm thế nào để đi một cấp lên trên dirname (__ FILE__)". Làm tốt. – Byson

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ẹ của __DIR__, lưu trữ thư mục hiện tại.

+0

Tôi đã thử điều đó và tôi có thể nhận được url. vấn đề là, tôi có một ../ trong tên tập tin mục tiêu của tôi được lưu trong cơ sở dữ liệu. Tôi cần phải loại bỏ điều đó trong url cuối cùng. – aVC

+0

Có thể là cụm từ thông dụng, một thứ gì đó dọc theo dòng: /[^\/\\]+\.\/\\/ Sử dụng biểu tượng đó để xóa cha mẹ /../ khỏi đường dẫn. 'nên' làm việc, chưa thử nghiệm. – Shane

+0

Xin lỗi, tôi đã tạo ra một lỗi nhỏ trong biểu thức chính quy ở trên,? \/Nên thực sự là?/ – Shane

12

Hãy thử điều này

dirname(dirname(__ FILE__)) 

Edit: gỡ bỏ "./" bởi vì nó không phải là cú pháp chính xác. Không có nó, nó hoạt động hoàn hảo.

-3

tôi sử dụng 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'>"); 
1

Bạn có thể sử dụng realpath để xóa phần không chính thức:

// 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 cửa sổ cũng thay thế \ với / nếu cần điều đó trong URL.

0

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

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

hoặc cho php < 5.3:

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

Nếu bạn tình cờ có php 7.0 bạn có thể sử dụng các cấp.

dirname(__FILE__, 2) với tham số thứ hai, bạn có thể xác định số lượng các cấp bạn muốn quay lại.

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

Các vấn đề liên quan