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.