Làm cách nào để có đường dẫn công khai: //


43

Tôi cần lấy đường dẫn cho công khai: // lúc chạy. Có một chức năng tôi có thể sử dụng để có được nó?

Câu trả lời:


34

Bạn có thể sử dụng mã sau đây, để có được đường dẫn công khai thực sự: //.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $realpath = $wrapper->realpath();
  // ...
}

Mã này là phiên bản đơn giản của mã được sử dụng bởi file_create_url(), với các khác biệt sau:

  • Nó không cho phép các mô-đun của bên thứ ba thay đổi URL, vì OP đang yêu cầu đường dẫn được liên kết với công chúng: //
  • Nó không kiểm tra URI chứa: //, vì điều này rõ ràng là đúng
  • Nó không kiểm tra URI là URI liên quan đến root, vì điều này rõ ràng là sai đối với công khai: //
  • Nó không kiểm tra URI là giao thức tương đối, vì điều này rõ ràng là sai trong trường hợp của OP
  • Nó không kiểm tra URI không phải là luồng được định dạng chính xác, vì công khai: // là luồng được định dạng đúng
  • Nó không kiểm tra xem lược đồ là http hay https, vì trong trường hợp này là công khai
  • Nó không gọi $wrapper->getExternalUrl()vì OP đang yêu cầu đường dẫn, không phải cho URL

Nếu OP muốn URL công khai: //, thì tôi đã sử dụng đoạn mã sau, đây vẫn là phiên bản đơn giản của mã được sử dụng bởi hàm Drupal, cần phải chung chung hơn.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}

3
@ Junedkazi's là một câu trả lời tốt hơn.
AlessMascherpa

1
Đọc mã được sử dụng bởi file_create_url(); bạn sẽ thấy mã được thực thi, trong trường hợp này, chính xác là mã tôi đã viết trong câu trả lời của mình.
kiamlaluno

1
điều này sẽ giúp bạn có đường dẫn máy chủ đầy đủ, không phải url.
DrCord

@DrCord Nó cung cấp cho bạn điều tương tự file_create_url()mang lại cho bạn.
kiamlaluno

1
không, không, nó cung cấp cho bạn đường dẫn máy chủ như/var/www/webroot/etc/more_folders/
DrCord

39

Bạn có thể sử dụng hàm file_create_url .

$uri = 'public://';
$path= file_create_url($uri)

Điều này giúp bạn có được url, nhưng bao gồm cả máy chủ. Tôi đã sử dụng một regex đơn giản và global $base_urlđể loại bỏ nó và làm cho máy chủ này không thể tin được. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);Đảm bảo sử dụng '#' trong regex, nếu không, thay thế sẽ thất bại do không thoát '/' trong $ base_url.
DrCord

3
OP yêu cầu đường dẫn, không phải URL.
kiamlaluno

20

Trong trường hợp nếu bạn chỉ sử dụng các tệp cục bộ ( không phải từ xa! ), Bạn cũng có thể thử drupal_realpath ()

$path = 'public://custom_map';
drupal_realpath($path);

Nó sẽ trở lại:

D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map

4
Điều này trả về một đường dẫn và không phải là một URL, đó là những gì câu hỏi yêu cầu. Theo tôi điều này tốt hơn câu trả lời được chấp nhận.
Scott Joudry

api.drupal.org/api/drupal/includes!file.inc/function/ . drupal_realpath () không được dùng trong các bình luận.
Wordzilla

1
@Wordzilla, không phải vậy. Nếu bạn sẽ kiểm tra nguồn Drupal mới nhất, bạn sẽ thấy việc sử dụng nó ở nhiều nơi, nó không bị phản đối nhưng việc sử dụng phải bị hạn chế. Tài liệu trong file.inc nói rằng nó "không được khuyến khích", nhưng không được phản đối.
Andrey Rudenko

@ScottJoudry OP yêu cầu đường dẫn công khai: // , không phải URL.
kiamlaluno

@Wordzilla: Các tài liệu không nói rằng nó bị phản đối; họ nói rằng nó không được khuyến khích vì nó chỉ xử lý các đường dẫn tệp cục bộ (mà hệ thống tệp công khai sẽ có). Từ các tài liệu: "Chỉ sử dụng chức năng này nếu bạn biết rằng trình bao bọc luồng trong URI sử dụng hệ thống tệp cục bộ và bạn cần chuyển một đường dẫn tuyệt đối đến một chức năng không tương thích với các URI luồng."
GuyPaddock

3

Xem các ví dụ sau:

$scheme = file_uri_scheme($file);

if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
  $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
  $path = $wrapper->getLocalPath($file);
}

hoặc là:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;

Kiểm tra API cho DrupalPublicStreamWrapper.

Việc sử dụng file_create_url()không hoạt động trong mọi trường hợp (như các câu trả lời khác đề xuất), vì URL được trả lại không phải trên cùng một máy chủ. Và sử dụng $_SERVER['DOCUMENT_ROOT']chỉ hoạt động cho các cấu hình máy chủ nhất định.

Nếu bạn không muốn sử dụng trình bao bọc luồng, bạn có thể thử giải pháp đơn giản hơn:

$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);

Mặt khác, nếu bạn cần một cái gì đó hoạt động chung hơn, hãy kiểm tra giải pháp của @ hannanxp :

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
if ($wrapper instanceof DrupalLocalStreamWrapper) {
  $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
}
else {
  // This does not appear to be a local file so there's no such thing as
  // a relative path; do appropriate error handling here.
}

Đọc thêm: Làm thế nào tôi có thể chuyển đổi một tập tin uri thành đường dẫn tương đối?


Liên quan:

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.