Genel için yolu nasıl alabilirim: //


43

Çalışma zamanında public: // yolunu bulmam gerekiyor. Onu almak için kullanabileceğim bir işlev var mı?

Yanıtlar:


34

Halkın asıl yolunu bulmak için aşağıdaki kodu kullanabilirsiniz: //.

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

Bu kod, file_create_url()aşağıdaki farklılıklar ile kullanılan kodun basitleştirilmiş sürümüdür :

  • OP, public: // ile ilişkili yolu istediğinden üçüncü taraf modüllerin URL'yi değiştirmesine izin vermiyor.
  • Bu URI'nin içeriğini kontrol etmiyor: //, çünkü bu açıkça doğru
  • URI'nin kök-göreli bir URI olup olmadığını kontrol etmez, çünkü bu açıkça herkes için yanlıştır: //
  • OP'nin durumunda açıkça yanlış olduğu için URI'nin protokolle ilgili olduğunu kontrol etmez.
  • Public: // düzgün biçimlendirilmiş bir akış olduğundan URI'nin düzgün biçimlendirilmiş bir akış olmadığını kontrol etmez
  • Bu durumda genel olduğu için planın http veya https olup olmadığını kontrol etmez.
  • Bu çağırmaz $wrapper->getExternalUrl()OP değil URL için, yolun istiyor beri

OP, URL’yi genel için istiyorsa: //, daha genel olması gereken Drupal işlevi tarafından kullanılan kodun basitleştirilmiş bir sürümü olan aşağıdaki kodu kullanırdım.

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

3
@ junedkazi en iyi cevaptır.
— AlessMascherpa

1
Tarafından kullanılan kodu okuyun file_create_url(); Yürütülen kodu göreceksiniz, bu durumda tam olarak cevabımda yazdığım kod.
— kiamlaluno

1
bu, URL'yi değil, tam sunucu yolunu alır.
— DrCord

@DrCord Size verir aynı şeyi file_create_url()verir.
— kiamlaluno

1
hayır değil, size gibi bir sunucu yolu verir/var/www/webroot/etc/more_folders/
— DrCord

39

File_create_url işlevini kullanabilirsiniz .

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

Bu, url'yi alır, ancak sunucuyu da içerir. Basit bir regex ve global $base_urlonu kaldırmak ve bu sunucuyu agnostik yapmak için kullandım. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);Regex'te '#' kullandığınızdan emin olun, aksi takdirde değiştirme işlemi $ base_url dosyasındaki çıkmamış bir '/' nedeniyle başarısız olur.
— DrCord

3
OP, yolu istedi, URL'yi değil.
— kiamlaluno

20

Yalnızca yerel dosyalar kullanıyorsanız ( uzak değil! ), Drupal_realpath () yöntemini de deneyebilirsiniz.

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

Geri dönecek:

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

4
Bu, URL'nin değil, sorunun sorduğu şeyin yolunu döndürür. Bence bu kabul edilen cevaptan daha iyi.
— Scott Joudry

api.drupal.org/api/drupal/includes!file.inc/function/… . drupal_realpath () yorumlarda görüldüğü gibi kullanımdan kaldırılmıştır.
— Wordzilla

1
@Wordzilla, iyi değil. En son Drupal kaynağını kontrol edecekseniz, büyük miktarda kullanımda olduğunu göreceksiniz, kullanımdan kaldırılmamış ancak kullanımının kısıtlanması gerekiyor. File.inc içindeki belgeler bunun "cesaret kırıcı" olduğunu, ancak onaylanmadığını söylüyor.
— Andrey Rudenko,

@ScottJoudry OP , URL için değil genel: // yolunu sorar .
— kiamlaluno

@Wordzilla: Dokümanlar, kullanımdan kaldırıldığını söylemiyor; sadece yerel dosya yollarını (ortak dosya sisteminin olacağı) kullandığı için cesaretini kırdıklarını söylediler. Belgelerden: "Bu işlevi yalnızca, URI'daki akış sarmalayıcısının yerel dosya sistemini kullandığını biliyorsanız ve akış URI'larıyla uyumlu olmayan bir işleve mutlak bir yol iletmeniz gerekiyorsa kullanın."
— GuyPaddock

3

Aşağıdaki örneklere bakınız:

$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);
}

veya:

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

İçin API'yi kontrol edin DrupalPublicStreamWrapper.

Kullanmak file_create_url()her durumda işe yaramaz (diğer yanıtların önerdiği gibi), çünkü döndürülen URL'nin aynı sunucuda olması gerekmez. Ve $_SERVER['DOCUMENT_ROOT']yalnızca belirli sunucu yapılandırmaları için çalışır.

Akış sarmalayıcıları kullanmak istemiyorsanız, daha basit bir çözüm deneyebilirsiniz:

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

Aksi takdirde, daha genel olarak işe yarayan bir şeye ihtiyacınız olursa, @ hannanxp'in çözümüne göz atın :

$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.
}

Devamını oku: Bir dosyayı uri'yi göreli yola nasıl dönüştürebilirim?


İlgili:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.